移动零移除元素
移動零
給定一個數(shù)組 nums,編寫一個函數(shù)將所有 0 移動到數(shù)組的末尾,同時保持非零元素的相對順序。
示例:
輸入: [0,1,0,3,12]
輸出: [1,3,12,0,0]
說明:
必須在原數(shù)組上操作,不能拷貝額外的數(shù)組。
盡量減少操作次數(shù)。
這道題我開始想到了某種交換應(yīng)該可以解決,但是沒有寫出代碼;看了官方的題解后真的是太妙了,大致思路是:
兩個指針fast和slow開始位于數(shù)組首端,如果fast不為0則與slow交換數(shù)值,若為零則繼續(xù)向前走;在這里fast將會遍歷完數(shù)組中的所有元素,但是slow除了首元素不確定外其余時候都指向0;(slow和fast拉開差距的關(guān)鍵是slow只有在fast不為0時才會走)。
1,慢指針左邊全部為非零數(shù)
2,快指針左邊直到慢指針都為零
代碼如下:
void swap(int *a,int *b) {int t;t=*a;*a=*b;*b=t; } void moveZeroes(int* nums, int numsSize) {int fast=0;int slow=0;//這里沒有定義指針,而是用的數(shù)組下標(biāo),意思一樣while(fast<numsSize){if(nums[fast])//當(dāng)fast對應(yīng)值不為0{swap(nums+fast,nums+slow);slow++;}fast++;//fast始終前進}下面有一道類似的題目:
移除元素
給你一個數(shù)組 nums 和一個值 val,你需要 原地 移除所有數(shù)值等于 val 的元素,并返回移除后數(shù)組的新長度。
不要使用額外的數(shù)組空間,你必須僅使用 O(1) 額外空間并 原地 修改輸入數(shù)組。
元素的順序可以改變。你不需要考慮數(shù)組中超出新長度后面的元素。
說明:
為什么返回數(shù)值是整數(shù),但輸出的答案是數(shù)組呢?
請注意,輸入數(shù)組是以「引用」方式傳遞的,這意味著在函數(shù)里修改輸入數(shù)組對于調(diào)用者是可見的。
你可以想象內(nèi)部操作如下:
// nums 是以“引用”方式傳遞的。也就是說,不對實參作任何拷貝 int len = removeElement(nums, val);
// 在函數(shù)里修改輸入數(shù)組對于調(diào)用者是可見的。 // 根據(jù)你的函數(shù)返回的長度, 它會打印出數(shù)組中 該長度范圍內(nèi) 的所有元素。 for
(int i = 0; i < len; i++) {
print(nums[i]); }
示例 1:
輸入:nums = [3,2,2,3], val = 3
輸出:2, nums = [2,2]
解釋:函數(shù)應(yīng)該返回新的長度 2, 并且 nums 中的前兩個元素均為 2。你不需要考慮數(shù)組中超出新長度后面的元素。例如,函數(shù)返回的新長度為 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也會被視作正確答案。
示例 2:
輸入:nums = [0,1,2,2,3,0,4,2], val = 2
輸出:5, nums = [0,1,4,0,3]
解釋:函數(shù)應(yīng)該返回新的長度 5, 并且 nums 中的前五個元素為 0, 1, 3, 0, 4。注意這五個元素可為任意順序。你不需要考慮數(shù)組中超出新長度后面的元素。
提示: 0 <= nums.length <= 100 0 <= nums[i] <= 50 0 <= val <= 100
方法幾乎一摸一樣,代碼如下:
void swap(int *a,int *b) {int t;t=*a;*a=*b;*b=t; } int removeElement(int* nums, int numsSize, int val) {int fast=0,slow=0;while(fast<numsSize){if(nums[fast]!=val){swap(nums+fast,nums+slow);slow++;}fast++;}return slow; }當(dāng)然這道題沒有硬性要求要把所有需要移除的元素移到最后,所以我們可以使用更簡單的方法,不用再寫交換了,直接賦值即可。
代碼如下:
總結(jié)
- 上一篇: 回文链表。
- 下一篇: 两数之和 II - 输入有序数组