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