摘要:給定一個(gè)排序數(shù)組,你需要在原地刪除重復(fù)出現(xiàn)的元素,使得每個(gè)元素最多出現(xiàn)兩次,返回移除后數(shù)組的新長(zhǎng)度。正確思路對(duì)于每一個(gè)元素,都進(jìn)行移動(dòng)。或者比較不到最后一個(gè)對(duì)象。
給定一個(gè)排序數(shù)組,你需要在原地刪除重復(fù)出現(xiàn)的元素,使得每個(gè)元素最多出現(xiàn)兩次,返回移除后數(shù)組的新長(zhǎng)度。不要使用額外的數(shù)組空間,你必須在原地修改輸入數(shù)組并在使用 O(1) 額外空間的條件下完成。
錯(cuò)誤思路:
由26題跳過一個(gè)的思路,很自然的聯(lián)想到跳過2個(gè)即可。但是對(duì)于{0,0,1,1,1,1,2,3,3}這種情況,最后一個(gè)3無法被放到前面去,結(jié)果是{0,0,1,1,2,3,2,3,3},這是因?yàn)殄e(cuò)誤代碼將第一個(gè)不同的值移動(dòng)到正確位置以后,下一個(gè)和剛被移動(dòng)的這個(gè)值比對(duì)如果相同的話,是要等待下一次移動(dòng)的,而下一次已經(jīng)到了數(shù)組末尾,不再進(jìn)行移動(dòng)操作。
所以增加針對(duì)最后一個(gè)元素的處理(因?yàn)槲抑幌氲搅俗詈笠粋€(gè)元素可能和剛被移動(dòng)的元素相同的情況),但是又引發(fā)了一個(gè)bug,即{1,1,1,2,2,3}->{1,1,2,2,3,3},當(dāng)全部移動(dòng)完成后,我會(huì)多帶帶去比較最后一個(gè)元素是否和剛被移動(dòng)的相同,相同的話,直接放到剛被正確安放的元素后,這樣就導(dǎo)致了重復(fù)數(shù)據(jù)的出現(xiàn)。
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.對(duì)于每一個(gè)元素,都進(jìn)行移動(dòng)。
2.計(jì)算相同的個(gè)數(shù),相同的數(shù)量在2個(gè)以上時(shí),就不進(jìn)行移動(dòng)
3.不是比較nums[i]和nums[i+1],因?yàn)檫@樣會(huì)導(dǎo)致溢出,參見26題的錯(cuò)誤思路。或者比較不到最后一個(gè)對(duì)象。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/77854.html
摘要:給定一個(gè)排序數(shù)組,你需要在原地刪除重復(fù)出現(xiàn)的元素,使得每個(gè)元素只出現(xiàn)一次,返回移除后數(shù)組的新長(zhǎng)度。不要使用額外的數(shù)組空間,你必須在原地修改輸入數(shù)組并在使用額外空間的條件下完成。聲明兩個(gè)指針,為快指針,為慢指針如果遇到相同的數(shù),那么就跳過,。 給定一個(gè)排序數(shù)組,你需要在原地刪除重復(fù)出現(xiàn)的元素,使得每個(gè)元素只出現(xiàn)一次,返回移除后數(shù)組的新長(zhǎng)度。不要使用額外的數(shù)組空間,你必須在原地修改輸入數(shù)組...
摘要:思路與代碼其實(shí)在這里我們?nèi)匀谎永m(xù)中的思路。在遇到非重復(fù)值以及非多余的重復(fù)值時(shí),將數(shù)值移動(dòng)到當(dāng)前記錄的下標(biāo)上。保證該下標(biāo)前的值均為滿足題目條件的值。第一次我使用了來記錄某個(gè)值出現(xiàn)的次數(shù)。 題目要求 Follow up for Remove Duplicates: What if duplicates are allowed at most twice? For example, Giv...
摘要:雙指針法復(fù)雜度時(shí)間空間思路我們可以將不重復(fù)的序列存到數(shù)列前面,因?yàn)椴恢貜?fù)序列的長(zhǎng)度一定小于等于總序列,所以不用擔(dān)心覆蓋的問題。代碼雙指針法復(fù)雜度時(shí)間空間思路思路和上題一樣,區(qū)別在于記錄前兩個(gè)遍歷到的數(shù)字來幫助我們判斷是否出現(xiàn)了第三遍。 Remove Duplicates from Sorted Array I Given a sorted array, remove the dupl...
摘要:思路原數(shù)組長(zhǎng)度為,則返回原數(shù)組長(zhǎng)度不為,則至少有個(gè)元素。將所有不重復(fù)的數(shù)值賦給,而當(dāng)和相等時(shí),不做處理。最后返回的就是不同元素的個(gè)數(shù),也是新數(shù)組的長(zhǎng)度。只有在時(shí),才對(duì)賦值。注意,每次初始化的時(shí)候要分兩種情況,這就意味著從的時(shí)候開始遍歷。 Remove Duplicates from Sorted Array I Problem Given a sorted array, remove ...
摘要:題目要求翻譯將鏈表中重復(fù)的元素全部刪除,返回新的頭結(jié)點(diǎn)。相比于,這里將重復(fù)的元素全部刪除。除此以外,我們還需要知道重復(fù)元素的前一個(gè)值和重復(fù)元素的最后一個(gè)值。如果存在重復(fù)值,則跳過重復(fù)值后,前節(jié)點(diǎn)不變,否則前節(jié)點(diǎn)跟隨后節(jié)點(diǎn)同時(shí)向后移動(dòng)。 題目要求 Given a sorted linked list, delete all nodes that have duplicate number...
閱讀 2215·2021-09-07 09:58
閱讀 3390·2019-08-30 14:07
閱讀 1305·2019-08-29 12:32
閱讀 666·2019-08-29 11:06
閱讀 3691·2019-08-26 18:18
閱讀 3730·2019-08-26 17:35
閱讀 1381·2019-08-26 11:35
閱讀 610·2019-08-26 11:35