首页 > 试题广场 >

移动 0

[编程题]移动 0
  • 热度指数:3883 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个数组,请你实现将所有 0 移动到数组末尾并且不改变其他数字的相对顺序。

数据范围:数组长度满足 ,数组中的元素满足
示例1

输入

[1,2,0,3]

输出

[1,2,3,0]
示例2

输入

[1,2,3]

输出

[1,2,3]
示例3

输入

[0,0]

输出

[0,0]
快排partition的过程,分为一个等于0区和不等于0区,不等于0区一开始的索引noEqualZeroIndex = -1,然后开始遍历数组, 会有两种情况
    情况一:碰到0,直接跳到下一个位置;
    情况二:碰到非0,当前元素和不等于0区下个元素交换位置,然后不等于0区向右扩
遍历到底结束
public int[] moveZeroes (int[] nums) {
    int noEqualZeroIndex = -1;
    for (int curIndex = 0; curIndex < nums.length; curIndex++) {
        if(nums[curIndex] != 0) {
            swap(nums, ++noEqualZeroIndex, curIndex);
        }
    }
    return nums;
}

private void swap(int[] nums, int i1, int i2) {
    if (i1 == i2) {
        return;
    }
    nums[i1] ^= nums[i2];
    nums[i2] ^= nums[i1];
    nums[i1] ^= nums[i2];
}


发表于 2023-08-18 13:31:51 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型一维数组
     * @return int整型一维数组
     */
    public int[] moveZeroes (int[] nums) {
        // write code here
        int [] res = new int [nums.length];
        int j = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                res[j] = nums[i];
                j++;
            }
        }
        return res;
    }
}
发表于 2022-09-07 15:05:08 回复(0)
public int[] moveZeroes (int[] nums) {
        int[] c=new int[nums.length];
        int j=0;
        for(int i=0;i<nums.length;i++){
            if(nums[i]==0)continue;
            c[j++]=nums[i];
        }
        return c;
    }

发表于 2022-06-18 18:10:14 回复(0)
双指针覆盖法
import java.util.*;
public class Solution {
    public int[] moveZeroes (int[] nums) {
        int n = nums.length;
        int lastNotZero = -1;
        // 从后往前,进行覆盖
        for (int i = 0; i < n; i++) {
            if (nums[i] != 0) {
                nums[++lastNotZero] = nums[i];
            }
        }
        for (int i = lastNotZero + 1; i < n; i++) {
            nums[i] = 0;
        }
        return nums;
    }
}


发表于 2022-04-25 12:02:13 回复(0)
if (nums == null) return null;
        //第一次遍历 找到非0的元素 
        int j = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                nums[j++] = nums[i];
            }
        }
        //第二次遍历将j指针以后 的元素 赋0
        for (int i = j; i < nums.length; i++) {
            nums[i] = 0;
        }

        return nums;

发表于 2022-03-13 11:50:13 回复(0)
import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型一维数组
     * @return int整型一维数组
     */
    public int[] moveZeroes (int[] nums) {
        // write code here
        List<Integer> list=new ArrayList<>();
        for(int i=0;i<nums.length;i++){
            if(nums[i]!=0){
                list.add(nums[i]);
            }
            continue;
        }
        for(int i=0;i<nums.length;i++){
            if(i<list.size()){
                nums[i]=list.get(i);
                continue;
            }
               nums[i]=0;
        }
        return nums;
    }
}

发表于 2022-03-07 22:00:13 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型一维数组
     */
    public int[] moveZeroes (int[] nums) {
        int n = nums.length;
        int l = 0;
        int r = 0;
        for (int i = 0; i < n; i ++) {
            if (nums[i] == 0) {
                r ++;
            } else {
                int temp = nums[l];
                nums[l] = nums[r];
                nums[r] = temp;
                l ++;
                r ++;
            }
        }
        return nums;
    }
}

发表于 2022-02-27 20:51:05 回复(0)
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型一维数组
     */
    public int[] moveZeroes (int[] nums) {
        // write code here
        int length = nums.length;
        int count = 0;
        int[] temp = new int[length];
        int j =0;
        for(int i=0;i<length;i++){
            if(nums[i]==0){
                count++;
            }
            else{
                temp[j++] = nums[i];
            }
        }
        for(;count>0;count--){
            temp[j] = 0;
        }
        return temp;
    }
}
发表于 2022-01-19 19:41:14 回复(0)
public int[] moveZeroes (int[] nums) {
        // write code here
        int zero_count = 0; //记录0出现的次数
        int res[] = new int[nums.length]; //创建最终的数据存放最终的数据
        int k = 0;
        for(int i : nums){
            if(i == 0){
                zero_count ++;
            }else{
                res[k++] = i;
            }
        }
        if(zero_count == 0){
            return nums;
        }
        //将剩下的几个0 都存放到数组最后
        for(int i = nums.length - zero_count ; i < nums.length ; i ++){
            res[i] = 0;
        }
        return res;
    }

发表于 2022-01-06 11:46:41 回复(0)
public int[] moveZeroes (int[] nums) {
        // write code here
        int[] number = new int[nums.length];
        Queue<Integer> queue = new LinkedList<>();
        Queue<Integer> Zeroqueue = new LinkedList<>();
        int a = 0;
        for (int num : nums) {
            if (num!=0){
                number[a] = num;
                a++;
            } else {
                Zeroqueue.add(num);
            }
        }
        int num1 = Zeroqueue.size();
        for (int i = 0; i <num1 ; i++) {
            number[i+a] = Zeroqueue.poll();
        }
        return number;
    }

发表于 2021-12-28 22:21:46 回复(0)
创建第二个数组,就很简单了
 
    public int[] moveZeroes (int[] nums) {
        int[] tem = new int[nums.length];        
        int t = 0;
        for(int i=0;i<nums.length;i++){
           if(nums[i] !=0){
               tem[t++]=nums[i];
           }
        }
        return tem;       
    }
}
发表于 2021-12-16 19:00:37 回复(0)

双指针法进行原地调整

准备一个left指针和一个right指针,初始都在0位置,如果碰到非零元素,left指针就右移,否则right指针从left指针的后一个位置出发右移,直到发现第一个非零元素,与left指针所指的0进行交换,然后left指针继续右移检查下一个位置。
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型一维数组
     */
    public int[] moveZeroes (int[] nums) {
        // write code here
        int left = 0, right = 0;
        while(left < nums.length && right < nums.length){
            if(nums[left] != 0){
                left ++;
            }else {
                right = left + 1;
                while(right < nums.length && nums[right] == 0){
                    right ++;
                }
                if(right < nums.length && nums[right] != 0){
                    swap(nums, left++, right);
                }
            }
        }
        return nums;
    }
    
    private void swap(int[] arr, int i, int j) {
        if(i != j){
            arr[i] = arr[i] ^ arr[j];
            arr[j] = arr[i] ^ arr[j];
            arr[i] = arr[i] ^ arr[j];
        }
    }
}

发表于 2021-12-11 11:17:19 回复(1)
import java.util.*;


public class Solution {
    public static int[] moveZeroes (int[] nums) {
        List<Integer> list=new ArrayList<>();
        for (int i = 0; i < nums.length; i++) {
            if(nums[i]!=0) list.add(nums[i]);
        }
        int s=list.size();
        for (int i = 0; i < (nums.length-s); i++) {
            list.add(0);
        }
        return list.stream().mapToInt(Integer::valueOf).toArray();
    }
}

发表于 2021-11-26 19:49:51 回复(0)

问题信息

难度:
13条回答 1427浏览

热门推荐

通过挑战的用户

查看代码