LeetCode Easy: 26-28
紀錄解題當下的思路與收穫的知識點

\26. Remove Duplicates from Sorted Array

數組去重

  • 想對數組做啥,都可以考慮雙指針
public int removeDuplicates(int[] nums) {
    // 起始第一個指針從頭開始
    int p = 0;
    // 第二個指針,從p+1開始
    for (int q = 1; q < nums.length; ) {
        // 如果不一樣
        if (nums[p] != nums[q]) {
            // 就把q往前搬,讓不一樣的數緊貼著第一個指針
            nums[p + 1] = nums[q];
            // 並且讓第一個指針P移往下一步
            p++;
        }
        // 如果數字一樣表示要被忽略,q往後移,直到找到不同的數字
        q++;
    }
    //
    return p + 1;
}

\27. Remove Element

  • 指針的妙用
public int removeElement(int[] nums, int val) {
    // 指針
    int idx = 0;
    // 遍歷數組
    for (int num : nums) {
        // 如果不是要移除的
        if (num != val) {
            // 就保持原樣
            nums[idx] = num;
            // 並且指針往後移
            idx++;
        }
        // 如果是要移除的,那就不會保留,且被之後的數據覆蓋
    }
    return idx;
}

\28. Implement strStr()

  • 匹配字符串,原諒我只會基礎暴力法
  • KMP 解法更優,然而我看半天,當下以為懂了隔一會再看又矇了,實在看暈了
public int strStr(String haystack, String needle) {
    // 先取出長度,m是長串,n是要匹配的針
    int m = haystack.length(), n = needle.length();
    // 轉換成Array
    char[] s = haystack.toCharArray(), p = needle.toCharArray();
    // 開始第一層遍歷,動的是haystack的索引,最終要返回的是索引i位於何處
    // 因為假設haystack包含needle,所以i的長度不會大於m - n
    for (int i = 0; i <= m - n; i++) {
        // 第二層遍歷,在haystack的i位置上,嘗試匹配是否後續的字=needle
        // a是i是haystack的索引,b是needle的頭
        int a = i, b = 0;
        // 從haystack的i位置上,與needle的頭開始一位一位比較,相同就往後再比
        while (b < n && s[a] == p[b]) {
            a++;
            b++;
        }
        // 當b的長度等於needle的長度n,表示完全匹配,haystack確實包含了needle
        // 就返回索引i所在的位置
        if (b == n) return i;
    }
    // 全部跑完發現沒包含,返回-1
    return -1;
}

上次修改於 2022-02-03