数组之移动零
题目:
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入:[0,1,0,3,12]
输出:[1,3,12,0,0]
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
示例 1:
给定 nums = [3,2,2,3], val = 3,
函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
你不需要考虑数组中超出新长度后面的元素。
示例 2:
给定 nums = [0,1,2,2,3,0,4,2], val = 2,
函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。
注意这五个元素可为任意顺序。
你不需要考虑数组中超出新长度后面的元素。
题目要求的是在原数组上操作,而我用两个方法,其中第一个方法不符合题目,但是可以作为结题思路之一
以下是代码:
1 第一解题思路(非符合题目) 2 不按题目:直接新建一个数组进行复制就可以了 3 public int removeElement(int[] nums, int val) { 4 //记录val值出现的次数 5 int c = 0; 6 for(int b : nums){ 7 if(b==val){ 8 c++; 9 } 10 } 11 //赋值新数组 12 //记录已经赋值的索引 13 int d = 0; 14 //新建一个数组,长度为原数组长度减去出现次数 15 int[] a = new int[nums.length-c]; 16 //遍历数组 17 for(int b : nums){ 18 if(b!=val){ 19 //如果当前的值不是Val就赋值给新数组 20 a[d] = b; 21 //索引加1 22 d++; 23 } 24 } 25 //直接赋值给前两位 26 for(int g = 0;g < a.length;g++){ 27 nums[g] = a[g]; 28 } 29 return a.length; 30 }
第二个解题思路 与第一个方法大同小异,只是没有新建数组符合题目,在原地操作 public int removeElement(int[] nums, int val) { //记录数组的长度 int n = nums.length; //记录要被换的值的索引,初始为-1 int i = -1; //索引增加器 int j = 0; //判断是否换完了 while(j < = n-1){ //如果当前索引的值等于val的值 if(nums[j] != val){ //把要换的索引加1 i++; //赋值 nums[i] = nuns[j]; } //如果不是就索引加1 j++; } return i+1; }
两个方法比较:第二个方法比第一个方法更加高效,第二个方法不用新建一个数组,不必浪费多的内存,但第一个方法更加直观。
只代表个人的观点,若有不对请多指正,谢谢。