vue删除数组中的一条数据_删除排序数组中的重复项 II
給定一個(gè)增序排列數(shù)組 nums ,你需要在 原地 刪除重復(fù)出現(xiàn)的元素,使得每個(gè)元素最多出現(xiàn)兩次,返回移除后數(shù)組的新長(zhǎng)度。
不要使用額外的數(shù)組空間,你必須在 原地 修改輸入數(shù)組 并在使用 O(1) 額外空間的條件下完成。(來(lái)源LeetCode 80)
例子示例1
輸入:nums = [1,1,1,2,2,3]
輸出:5, nums = [1,1,2,2,3]示例2
輸入:nums = [0,0,1,1,1,1,2,3,3]輸出:7, nums = [0,0,1,1,2,3,3]
示例3
輸入:nums =?[1,1,1,1]
輸出:2, nums = [1,1]解題思路這道題目其實(shí)是前面我們有聊過(guò)的“刪除排序數(shù)組中的重復(fù)項(xiàng)“的進(jìn)階版,其實(shí)我們直接的思路大體相似,無(wú)非這道題目是使每個(gè)元素最多出現(xiàn)兩次,當(dāng)然代碼實(shí)現(xiàn)上會(huì)稍微復(fù)雜一些,注意的條件也比較多。
思路一:我們還是遍歷數(shù)組,我們可以從第三個(gè)元素開(kāi)始遍歷,當(dāng)nums[i]==nums[i-2]時(shí),即這三個(gè)元素完全相等時(shí),我們可以往后面找,找到一個(gè)和nums[i]不相同的元素為止,將這后面這一串往前挪,這里就要注意不同情況,當(dāng)往后找的過(guò)程中如果找不到,那就應(yīng)該直接返回i,例如nums=[1,1,1,1,1];如果找到了,我們移動(dòng)的的時(shí)候也要注意,我們先定義個(gè)變量標(biāo)記移動(dòng)了多少位,然后進(jìn)行賦值,賦值完后“數(shù)組的長(zhǎng)度”其實(shí)也是分兩種情況的,例如nums=[1,1,1,1,1,2,3,4,5],我們移動(dòng)后變成nums={1,1,2,3,4,5,3,4,5},但是我們應(yīng)該只取前6位,例如nums={1,1,1,1,1,2},我們移動(dòng)后變成nums={1,1,2,1,1,2},但是我們應(yīng)該只取前2位;這就是兩只不同情況,具體大家可以結(jié)合下面圖示和代碼仔細(xì)揣摩一下。所以我們移動(dòng)完后,要改變遍歷的數(shù)組長(zhǎng)度,直至遍歷結(jié)束,i就是需要返回的數(shù)組長(zhǎng)度。
思路二:上述我們其實(shí)貌似不用這么復(fù)雜,我們定義兩個(gè)指針n,i,一個(gè)負(fù)責(zé)往后遍歷,一個(gè)記錄當(dāng)前“新數(shù)組“需要存放的最新位置,當(dāng)往后遍歷的過(guò)程中發(fā)現(xiàn)當(dāng)索引下標(biāo)的值不等于前面第二個(gè)元素時(shí),則將數(shù)組記錄需要存放的最新位置設(shè)置成當(dāng)前元素,以此類推返回i即為數(shù)組長(zhǎng)度,大家可以結(jié)合如下代碼仔細(xì)思考一下,再嘗試著自己去實(shí)現(xiàn)。
刪除排序數(shù)組中的重復(fù)項(xiàng)
MR.Zhu,公眾號(hào):1024和996刪除排序數(shù)組中的重復(fù)項(xiàng)代碼實(shí)現(xiàn)/** * leetcode 80 */public class Solution { /** * 方法一 * * @param nums * @return */ public int removeDuplicates(int[] nums) { if (nums == null || nums.length == 0) { return 0; } if (nums.length < 3) { return nums.length; } int i = 2; int length = nums.length; while (i < length) { if (nums[i] == nums[i - 2]) { int flag = i; int point = i; while (point + 1 != length && nums[point] == nums[point + 1]) { point++; } //沒(méi)找到,則返回 if (point + 1 == length) { return i; } //移動(dòng)賦值 for (int j = point + 1, k = 0; j < length; j++, k++) { nums[flag + k] = nums[j]; } //判斷有效長(zhǎng)度 if (length - point - 1 < point - i) { length = i + (length - point - 1); } else { length = length - (point + 1 - i); } } i++; } return i; } /** * 方法二 * @param nums * @return */ public int removeDuplicates2(int[] nums) { int i=0; for(int n:nums){ if(i<2){ i++; continue; } if(n!=nums[i-2]){ nums[i]=n; i++; } } return i; } public static void printArr(int[] arr) { for (int num : arr) { System.out.print(num + "\t"); } System.out.println(); } public static void main(String[] args) { int nums[] = { 0, 1, 1, 1, 1, 2, 3, 3, 3, 4 }; System.out.println("方法一刪除重復(fù)項(xiàng)后數(shù)組長(zhǎng)度:" + new Solution().removeDuplicates(nums)); System.out.println("方法一刪除重復(fù)項(xiàng)后數(shù)組為:"); printArr(nums); int nums2[] = { 0, 1, 1, 1, 1, 2, 3, 3, 3, 4 }; System.out.println("方法二刪除重復(fù)項(xiàng)后數(shù)組長(zhǎng)度:" + new Solution().removeDuplicates2(nums2)); System.out.println("方法二刪除重復(fù)項(xiàng)后數(shù)組為:"); printArr(nums2); }}運(yùn)行結(jié)果總結(jié)
以上是生活随笔為你收集整理的vue删除数组中的一条数据_删除排序数组中的重复项 II的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python个人收支管理系统相关题目_练
- 下一篇: vue进入页面执行的钩子函数_解决VUE