输入数组和指定的元素,存在则去除,返回新的数组长度,要求不额外申请数组内存。和之前的数组去重 有类似,但是这个数组是没有排序的,leetcode 第27题。自己做了一个,思路是将匹配的数据移动到数组末尾,从头开始遍历,如果匹配,首先判断是否尾部也匹配,如果不是,则交换,否则再从尾部往前找。这个过程中新的长度递减。代码如下第一部分。
第二部分是其他人提供的解法,非常简洁,这个根据一个假设来实现:如果遍历不等于目标数字,则其就是新数组里对应位置的值。思路非常好。
自己的解法:
import java.util.Arrays;
/**
* Created by igoso on 18-3-4.
*/
public class DayByDay {
public static void main(String[] args) {
int[] arr = {4,3,4,433,34,34,34,535,43,54,364,4,4,4,4,4,4,4,4,4,4,4,4,4,4,44,4,666,6,6,66,6};
System.out.println(removeElement(arr,4));
System.out.println(Arrays.toString(arr));
}
public static int removeElement(int[] nums, int val) {
if (nums == null || nums.length == 0) {
return 0;
}
int length = nums.length;
int j = length - 1;
for (int i = 0; i < nums.length; i++) {
if (val == nums[i]) {
while (i <= j) {
if (nums[j] != val) {
int t = nums[j];
nums[j] = nums[i];
nums[i] = t;
break;
}else {
j--;
}
--length;
}
}
}
return length;
}
}
更加简洁的解法:
class Solution {
public int removeElement(int[] a, int val) {
int start = 0;
int len = a.length;
int begin = 0;
for (int i = 0; i < len; i++)
if (a[i] != val)
a[begin++] = a[i];
return begin;
}
}
网友评论