打卡!打卡!

  一週一次的算法時間到了,學了前端後真的很少做算法題,感覺語法啥的不用都快忘了,還好每週訓練一次可以回憶一下😊

136.只出現一次的數字

  給定一個非空整數數組,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。

  說明:你的算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?
  示例 1:
  輸入: [2,2,1]
  輸出: 1
  示例 2:
  輸入: [4,1,2,1,2]
  輸出: 4

  解題思路:只有一個數是不同於其他數字的,也就意味這可以使用異或來找出這個數(0^任何數都爲這個數本身)

class Solution {
    public int singleNumber(int[] nums) {
        int a=0;
        for(int i=0;i<nums.length;i++){
            a=a^nums[i];
        }
        return a;
    }
}

28.實現 strStr()

  實現 strStr() 函數。

  給定一個 haystack 字符串和一個 needle 字符串,在 haystack 字符串中找出 needle 字符串出現的第一個位置 (從0開始)。如果不存在,則返回 -1。

  示例 1:
  輸入: haystack = “hello”, needle = “ll”
  輸出: 2
  示例 2:
  輸入: haystack = “aaaaa”, needle = “bba”
  輸出: -1
  說明:當 needle 是空字符串時,我們應當返回什麼值呢?這是一個在面試中很好的問題。對於本題而言,當 needle 是空字符串時我們應當返回 0 。這與C語言的 strstr() 以及 Java的 indexOf() 定義相符。
  解題思路:先判斷其是否相等或者是否有長度,然後在遍歷字符串找出與其相同的輸出下標即可

class Solution {
  public int strStr(String haystack, String needle) {
    int number=needle.length();
    if(number==0||needle.equals(haystack)){
       return 0;
    }
    for(int i=0;i<=haystack.length()-number;i++){
     //直接截取與needle相同的字符串比較,相同就返回下標
      if(haystack.substring(i,i+number).equals(needle)){
        return i;
      }
    }
     return -1;
   }
}

414.第三大的數

  給定一個非空數組,返回此數組中第三大的數。如果不存在,則返回數組中最大的數。要求算法時間複雜度必須是O(n)。

  示例 1:
  輸入: [3, 2, 1]
  輸出: 1
  解釋: 第三大的數是 1.
  示例 2:
  輸入: [1, 2]
  輸出: 2
  解釋: 第三大的數不存在, 所以返回最大的數 2 .
  示例 3:
  輸入: [2, 2, 3, 1]
  輸出: 1
  解釋: 注意,要求返回第三大的數,是指第三大且唯一出現的數。存在兩個值爲2的數,它們都排第二。
  解題思路:
  1.使用TreeSet集合,既可以排除重複的元素,也可以將其中的數進行排序(可謂是一箭雙鵰啊 ),不過複雜度是O(nlog3)
  該方法是對set的長度進行比較來返回第三大值,將數組中的元素一次添加到集合中,同時比較set的長度,若長度大於3則刪除第一個(即這個set中的最小值),最後若set的長度小於3則返回最大值(last),此時set的長度時小於等於3的,否則返回最小值(first)

class Solution {
 	public int thirdMax(int[] nums) {
       TreeSet<Integer> set=new TreeSet<>();
       for(Integer n:nums){
          set.add(n); 
          if(set.size()>3)set.remove(set.first());
       }
       return set.size()<3?set.last():set.first();
    }
}

2.使用普遍常用的比較方法,定義三個變量爲one、two、three分別來表示第一大、第二大、第三大的值,然後依次比較數組中的每個數,若該數大於第一個則將該值賦給第一個,並將原來的值往後移;若該數大於第二個,將該值賦給第二個,並將原來的值往後移;若該數大於第三個那該數就是第三大的數

class Solution {
    public int thirdMax(int[] nums) {
       int number=nums.length;
       int one=nums[0];
       long two=Long.MIN_VALUE;
       long three=Long.MIN_VALUE;
       for(int i=0;i<number;i++){
       //表示當前數,分別與第一大、第二大、帶三大比較
           int now=nums[i];
           if(now==one||now==two||now==three)continue;
           if(now>one){
               three=two;
               two=one;
               one=now;
           }
           else if(now>two){
               three=two;
               two=now;
           }
           else if(now>three){
               three=now;
           }
       }
       if(three==Long.MIN_VALUE){
             return one;
       }
       return (int)three;
   }
}
發佈了14 篇原創文章 · 獲贊 12 · 訪問量 1096
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章