「27. Remove Element(删除数组中指定元素)」
Question:
Given an array and a value, remove all instances of that value in place and return the new length. The order of elements can be changed. It doesn’t matter what you leave beyond the new length.
Translate:
在一个数组里面移除指定 value,并且返回新的数组长度。 这题唯一需要注意的地方在于 in place,不能新建另一个数组。
Problem-solving ideas:
使用两个游标 i 和 j,遍历数组,遇上非 value 则用 j 记录位置,同时递增 i,直到下一个非 value 出现,将此时 i 位置对应的值复制到 j 位置上,增加 j,重复上述过程直到遍历结束。此时返回 j 的值即为新的数组长度。
The code:
class Solution {
public int removeElement(int[] nums, int val) {
int i = 0;
int j = 0; //j用来记录非value的位置
/**
* 从左边开始遍历数组,当前元素如果等于value(即nums[i]==value),则继续执行,
* 反之,若为非value,则将此时 i 位置对应的值复制到 j 位置上。
*
*/
for (i=0; i<nums.length; i++) {
if (nums[i] == val) { //若当前元素与指定值value相等,则删除。
continue;
} else {
nums[j] = nums[i]; //将 i 位置对应的值复制到 j 位置上。
j ++;
}
}
return j;
}
}
完整实现示例:
/**
* Given an array and a value, remove all instances of that value in place and return the new length.
* The order of elements can be changed. It doesn’t matter what you leave beyond the new length.
* 解题思路:使用两个游标i和j,遍历数组,遇上非value则用j记录位置,同时递增i,直到下一个非value出现,将此时i对应的值复制到j位置上,
* 增加j,重复上述过程直到遍历结束。此时返回j的值即为新的数组长度。
* @author 樱木天亥
*/
public class Solution {
public static void main(String[] args) {
int[] arr = {1,2,2,3,2,4};
System.out.println("新数组的长度为:" + deleteElement(arr, 2));
}
public static int removeElement(int[] arr, int value) {
int i = 0;
int j = 0; //用来记录非value的位置
/**
* 从左边开始遍历数组,当前元素如果等于value(即nums[i]==value),则继续执行,
* 反之,若为非value,则将此时 i 位置对应的值复制到 j 位置上
*
*/
for (i=0; i<arr.length; i++) {
if(arr[i] == value) { //当前元素与指定值value相等,则删除
continue;
} else {
arr[j] = arr[i];
j ++;
}
}
return j;
}
}