题目描述见链接 力扣第 27 题 力扣链接
我是个笨人,想到的第一种方法如下:
第一种:
int removeElement(int[] arr, int removeValue){
List<Integer> list = new ArrayList<>();
for (int i : arr) {
if(i != removeValue){
list.add(i);
}
}
for (int i = 0; i < list.size(); i++) {
arr[i] = list.get(i);
}
return list.size();
}
提交情况:有点费内存...
但我又不甘做笨人,于是 参考资料后又琢磨了下面四种方法:
第二种:用双指针的方式
int removeElement(int[] nums, int val) {
int slow = 0;
for (int fast = 0; fast < nums.length; fast++) {
if(nums[fast] != val){
if(slow != fast){
nums[slow] = nums[fast];
}
slow++;
}
}
return slow;
}
第二种方法的执行情况:比第一种的内存消耗少了些...
第三种:在第二种方式的基础上 变成了递归的方式
public int removeElement(int[] nums, int val) {
return removeElement11(nums, 0, 0, val);
}
private int removeElement11(int[] arr, int slow, int fast, int removeValue){
if(fast >= arr.length){
return slow;
}
if(arr[fast] != removeValue){
arr[slow] = arr[fast];
return removeElement11(arr, slow + 1, fast + 1, removeValue);
}else{
return removeElement11(arr, slow, fast + 1, removeValue);
}
}
执行情况:
第四种:也是双指针 但是双向奔赴 两个指针分别位于前和后双向奔赴...
public int removeElement(int[] nums, int val) {
int left = 0;
int right = nums.length - 1;
while (left <= right){
if(nums[left] != val && nums[right] != val){
left++;
continue;
}
if(nums[left] == val && nums[right] == val){
right--;
continue;
}
if(nums[left] != val && nums[right] == val){
left++;
right--;
continue;
}
if(nums[left] == val && nums[right] != val){
nums[left] = nums[right];
left++;
right--;
continue;
}
}
return left;
}
执行结果:
第五种:在第四种的基础上,改成递归
public int removeElement(int[] nums, int val) {
return removeElement(nums, 0, nums.length - 1, val);
}
private int removeElement(int[] arr, int left, int right, int removeValue){
if(left > right){
return left;
}
if(arr[left] != removeValue && arr[right] != removeValue){
return removeElement(arr, left + 1, right, removeValue);
}else if(arr[left] == removeValue && arr[right] == removeValue){
return removeElement(arr, left, right - 1, removeValue);
}else if(arr[left] != removeValue && arr[right] == removeValue){
return removeElement(arr, left + 1, right - 1, removeValue);
}else{
// arr[left] == removeValue && arr[right] != removeValue
arr[left] = arr[right];
return removeElement(arr, left + 1, right - 1, removeValue);
}
}
运行结果:
~~END~~