藍橋杯基礎練習(實現strStr() ,移除元素,最大子序和,最後一個單詞的長度,無重複字符的最長子串)

題目:實現StrStr()  執行用時: 4 ms,
實現 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() 定義相符。

public int strStr(String haystack, String needle) {
       int h_length=haystack.length();
        int n_length = needle.length();
        if( h_length==0 && n_length!=0) return -1;
        if(h_length==0 && n_length==0) return 0;
       
        char[] h = haystack.toCharArray();
        char[] n = needle.toCharArray();
        String s2 = new String(n);
        for(int i=0;i<h_length-n_length+1;i++){ 
    //如果這裏不加1的話 "a" "a" 這種就通過不了
            String s1 = new String(h,i,n_length); 
    //從h 字符數組中獲取從i開始長度爲n_length 的字符
            if(s1.equals(s2)) return i;
        }
        return -1;
    }

註釋:
indexOf() 方法有以下四種形式:

public int indexOf(int ch): 
返回指定字符在字符串中第一次出現處的索引,如果此字符串中沒有這樣的字符,則返回 -1。
public int indexOf(int ch, int fromIndex): 
返回從 fromIndex 位置開始查找指定字符在字符串中第一次出現處的索引,如果此字符串中沒有這樣的字符,則返回 -1。
int indexOf(String str): 
返回指定字符在字符串中第一次出現處的索引,如果此字符串中沒有這樣的字符,則返回 -1。
int indexOf(String str, int fromIndex): 
返回從 fromIndex 位置開始查找指定字符在字符串中第一次出現處的索引,如果此字符串中沒有這樣的字符,則返回 -1。
題目:移除元素  https://leetcode-cn.com/problems/remove-element/solution/
給定一個數組 nums 和一個值 val,你需要原地移除所有數值等於 val 的元素,返回移除後數組的新長度。

不要使用額外的數組空間,你必須在原地修改輸入數組並在使用 O(1) 額外空間的條件下完成。

元素的順序可以改變。你不需要考慮數組中超出新長度後面的元素。

示例 1:

給定 nums = [3,2,2,3], val = 3,

函數應該返回新的長度 2, 並且 nums 中的前兩個元素均爲 2。

你不需要考慮數組中超出新長度後面的元素。
示例 2:

給定 nums = [0,1,2,2,3,0,4,2], val = 2,

函數應該返回新的長度 5, 並且 nums 中的前五個元素爲 0, 1, 3, 0, 4。

注意這五個元素可爲任意順序。

你不需要考慮數組中超出新長度後面的元素。
說明:

爲什麼返回數值是整數,但輸出的答案是數組呢?

請注意,輸入數組是以“引用”方式傳遞的,這意味着在函數裏修改輸入數組對於調用者是可見的。

你可以想象內部操作如下:

// nums 是以“引用”方式傳遞的。也就是說,不對實參作任何拷貝
int len = removeElement(nums, val);

// 在函數裏修改輸入數組對於調用者是可見的。
// 根據你的函數返回的長度, 它會打印出數組中該長度範圍內的所有元素。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}

注意啦:原定位置移數,題目理解錯誤做法還沒提交成功
public int removeElement(int[] nums, int val) {
        //先排序 然後把值提到後面去 然後倒轉-數
        Arrays.sort(nums);
        int temp,j=nums.length-1,len =nums.length ;
        while(nums[j] == val) j--;
        for(int i=0;i<nums.length;i++){
            if(nums[i] == val) {
                temp = nums[i];
                nums[i] = nums[j];
                nums[j--] = temp;
            }
        }
        for(int i=0;i<nums.length;i++){
            if(nums[i] == val) len--;
        }
        return len;
    }

法一:雙指針 5ms  與刪除排序數組中的重複項方法一樣 
https://leetcode-cn.com/articles/remove-duplicates-from-sorted-array/

public int removeElement(int[] nums, int val) {
       int i= 0;
           for(int j=0;j<nums.length;j++){
               if(nums[j] != val){
                   nums[i] = nums[j];
                   i++;
               }
           }
        return i;
    }
法二: 6 ms
當我們遇到 nums[i] = valnums[i]=val 時,我們可以將當前元素與最後一個元素進行交換,
並釋放最後一個元素。這實際上使數組的大小減少了 1。

請注意,被交換的最後一個元素可能是您想要移除的值。但是不要擔心,在下一次迭代中,
我們仍然會檢查這個元素。

 public int removeElement(int[] nums, int val) {
       int i= 0;
        int n = nums.length;
        while(i<n){
            if(nums[i] == val) {
                nums[i] = nums[n-1]; 
                //自己的誤區:將值交換,其實不需要,直接把val值捨棄,但是有個問題,如果n-1的值也等於val呢
                //解答 可以試着帶一組數據進去,會發現 最後nums[n-1] 仍舊進入if判斷重複操作
                n--;
            }else i++;
        }
        return n;
    }
題目:最大子序和(經典題) 
https://leetcode-cn.com/problems/maximum-subarray/
給定一個整數數組 nums ,找到一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。

示例:

輸入: [-2,1,-3,4,-1,2,1,-5,4],
輸出: 6
解釋: 連續子數組 [4,-1,2,1] 的和最大,爲 6。
進階:

如果你已經實現複雜度爲 O(n) 的解法,嘗試使用更爲精妙的分治法求解。
法一:
public int maxSubArray(int[] nums) {
        int[] maxValue = new int[nums.length];
        int res = nums[0];
        maxValue[0] = nums[0];
        for (int i = 1; i < nums.length; i++) {
            maxValue[i] = ((maxValue[i-1] + nums[i]) > nums[i] ? (maxValue[i-1] + nums[i]):nums[i]);
            if (maxValue[i] > res){
                res = maxValue[i];
            }
        }
        //System.out.print(res);
        return res;

法二:
思路:循環,拿到每個數,拿的時候做累加,如果出現小於0的,把累加和重新賦值0,再次累加

public int maxSubArray(int[] nums) {
        int res = nums[0];
        int sum = 0;
        for (int num : nums) {
            if (sum > 0)
                sum += num;
            else
                sum = num;
            res = Math.max(res, sum);
        }
        return res;
    }

註解: for(元素類型t 元素變量x : 遍歷對象obj){ 
     引用了x的java語句; 
}
這是一個foreach循環遍歷....

就是把nums這個數組進行遍歷,它有多少個數,就遍歷多少遍。

遍歷的時候每次就把其中的一個值給num;

for(int i =0;i<nums.length;i++){

    System.out.print(nums[i]+" ");

}

給這個for循環一樣....
題目:最後一個單詞的長度
https://leetcode-cn.com/problems/length-of-last-word/
給定一個僅包含大小寫字母和空格 ' ' 的字符串,返回其最後一個單詞的長度。

如果不存在最後一個單詞,請返回 0 。

說明:一個單詞是指由字母組成,但不包含任何空格的字符串。

示例:

輸入: "Hello World"
輸出: 5
代碼:
 //思路: 從後面開始找,碰到空格就停止
    public int lengthOfLastWord(String s) {
        int i=0,len = s.length(),count=0;
        char [] chars = s.toCharArray();
        for(i=len-1;i>=0;i--){  //最後一個 
             if(chars[i] == ' ') break;
                count++;
        }
        return count;
    }
public int lengthOfLastWord(String s) {
        int i=0,len = s.length(),count=0;
        for(i=len-1;i>=0;i--){  //最後一個 
             if(s.charAt(i) == ' ') 
                break;
             count++;
        }
        return count;
    }

 //思路: 將字符串變成字符串數組然後求最後一個的length
    public int lengthOfLastWord(String s) {
        String arr[] = s.split(' ');  //incompatible types: char cannot be converted to String
        int len = arr.length;
        int count = arr[len-1].length();
        return count;
    }
3. 無重複字符的最長子串
給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。
示例 1:
輸入: "abcabcbb"   輸出: 3 
解釋: 因爲無重複字符的最長子串是 "abc",所以其長度爲 3。
示例 2:
輸入: "bbbbb"  輸出: 1
解釋: 因爲無重複字符的最長子串是 "b",所以其長度爲 1。
示例 3:
輸入: "pwwkew"  輸出: 3
解釋: 因爲無重複字符的最長子串是 "wke",所以其長度爲 3。
     請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。




 

時間:2018.12.10

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章