移除元素
題目描述:給你一個(gè)數(shù)組 nums 和一個(gè)值 val炎功,你需要 原地 移除所有數(shù)值等于 val 的元素烧董,并返回移除后數(shù)組的新長度凸郑。
不要使用額外的數(shù)組空間抖甘,你必須僅使用 O(1) 額外空間并 原地 修改輸入數(shù)組。
元素的順序可以改變闷尿。你不需要考慮數(shù)組中超出新長度后面的元素塑径。
示例說明請(qǐng)見LeetCode官網(wǎng)。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/remove-element/
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有填具。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán)统舀,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處匆骗。
解法一:交換位置
- 首先,如果數(shù)組為空或者數(shù)組的長度為0誉简,直接返回0碉就;
- 然后,如果數(shù)組不為空闷串,遍歷數(shù)組瓮钥,count記錄和val值不相同的數(shù)目(也就是最后的返回值),index表示從0開始遍歷烹吵,reverseCount表示交換數(shù)字的次數(shù)碉熄,具體遍歷過程如下:
- 當(dāng)index對(duì)應(yīng)的值不等于val時(shí),count加1肋拔,并且index加1也就是往后移一位锈津;
- 當(dāng)index對(duì)應(yīng)的值等于val時(shí),判斷index是否后面可遍歷的位數(shù)凉蜂,如果是琼梆,則將index和可遍歷的最后一位交換數(shù)字,并且reverseCount+1窿吩,然后繼續(xù)遍歷茎杂;如果不是,則沒有可交換的位置纫雁,即已經(jīng)遍歷完成煌往。返回count值。
public class LeetCode_027 {
public static int removeElement(int[] nums, int val) {
if (nums == null || nums.length == 0) {
return 0;
}
int count = 0;
int index = 0;
int reverseCount = 0;
while (index < nums.length - reverseCount) {
if (nums[index] != val) {
index++;
count++;
} else {
if (index < (nums.length - 1 - reverseCount)) {
int temp = nums[index];
nums[index] = nums[nums.length - 1 - reverseCount];
nums[nums.length - 1 - reverseCount] = temp;
reverseCount++;
} else {
break;
}
}
}
return count;
}
public static void main(String[] args) {
int[] nums = new int[]{1};
System.out.println(removeElement(nums, 1));
System.out.println();
for (int num : nums) {
System.out.print(num + " ");
}
}
}
【每日寄語】 昨天是歷史先较,明天是謎團(tuán)携冤,只有今天是天賜的禮物悼粮。