给你一个数组 nums 和一个值 val,你需要nums中移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。
假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:
- 更改
nums数组,使nums的前k个元素包含不等于val的元素。nums的其余元素和nums的大小并不重要。 - 返回
k。
示例:
输入: nums = [3,2,2,3], val = 3
输出: 2, nums = [2,2,_,_]
解释: 你的函数函数应该返回 k = 2, 并且 nums 中的前两个元素均为 2。
你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。
解析: 实现思路:设置两个指针i,j,分别从数组的两头开始,每一次对比,如果相同,则将当前位置i的数据与数组的指针j的位置的数互换,这样可以保证j指针之后的数据全为要排除的数。
public int removeElement(int[] nums, int val) {
int i, j;
for (i = 0, j=nums.length-1; i < nums.length; ) {
if(nums[i]==val){
// 如果相等,则将两数交换,但下一次循环时还得从当前位置开始对比
int t = nums[i];
nums[i]=nums[j];
nums[j]=t;
j--;
}else{
i++;
}
// i=j时,两个指针相遇,当前位置的数据还需要判断,i>j时意味着j后面的数都是val,不需要再排除了
if(i>j){
break;
}
}
return i;
}
欢迎大家指正和讨论!