給定一個排序數組,你須要在原地刪除重複出現的元素,使得每一個元素最多出現兩次,返回移除後數組的新長度。不要使用額外的數組空間,你必須在原地修改輸入數組並在使用 O(1) 額外空間的條件下完成。數組
錯誤思路:
由26題跳過一個的思路,很天然的聯想到跳過2個便可。可是對於{0,0,1,1,1,1,2,3,3}這種狀況,最後一個3沒法被放到前面去,結果是{0,0,1,1,2,3,2,3,3},這是由於錯誤代碼將第一個不一樣的值移動到正確位置之後,下一個和剛被移動的這個值比對若是相同的話,是要等待下一次移動的,而下一次已經到了數組末尾,再也不進行移動操做。
因此增長針對最後一個元素的處理(由於我只想到了最後一個元素可能和剛被移動的元素相同的狀況),可是又引起了一個bug,即{1,1,1,2,2,3}->{1,1,2,2,3,3},當所有移動完成後,我會單獨去比較最後一個元素是否和剛被移動的相同,相同的話,直接放到剛被正確安放的元素後,這樣就致使了重複數據的出現。code
public static int removeDuplicates(int[] nums) { int i = 0, j = 0, count=1; for(i = 1; i < nums.length; i++) { if(nums[i] != nums[j]) { if (count >= 2) { j = j + 2; nums[j] = nums[i]; } else { j = j + 1; nums[j] = nums[i]; } count = 1; } else { count++; } } if (nums[nums.length - 1] == nums[j]) { j = j + 1; nums[j] = nums[nums.length - 1]; } System.out.println(j+1); return j+1; }
正確思路:對象
public int removeDuplicates(int[] nums) { int i = 0, j = 0, count=1; for(i = 1; i < nums.length; i++) { if(nums[i] == nums[i-1]) { count++; } else { count = 1; } if (count <= 2) { j = j + 1; nums[j] = nums[i]; } } System.out.println(j+1); return j+1; }
1.對於每個元素,都進行移動。
2.計算相同的個數,相同的數量在2個以上時,就不進行移動
3.不是比較nums[i]和nums[i+1],由於這樣會致使溢出,參見26題的錯誤思路。或者比較不到最後一個對象。排序