数组之移动零

题目:

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:

  1. 必须在原数组上操作,不能拷贝额外的数组。
  2. 尽量减少操作次数。

示例 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;
    }

两个方法比较:第二个方法比第一个方法更加高效,第二个方法不用新建一个数组,不必浪费多的内存,但第一个方法更加直观。

猜你喜欢

转载自www.cnblogs.com/DkitAndJho/p/10849204.html