首页 > 试题广场 >

移动 0

[编程题]移动 0
  • 热度指数:3832 时间限制: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]
public int[] moveZeroes (int[] nums) {
        int j = 0;
        //指针i遍历数组,如果i遍历到的数不是0,则将该数移动到j位置上,同时j右移
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] != 0) {
                nums[j++] = nums[i];
            }
        }
        //i遍历结束时,j的大小就是非零元素的个数,指向最后一个非零元素的后一个位置。后面的元素置0
        while (j < nums.length) {
            nums[j++] = 0;
        }
        return nums;
    }

发表于 2022-04-14 15:05:11 回复(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)
牛客最简单的一道题:
 public int[] moveZeroes (int[] nums) {
        // write code here
        int[] res = new int[nums.length];
        int j = 0;
        for (int num : nums)
            if (num != 0)
                res[j++] = num;

        return res;
    }


发表于 2024-05-07 12:12:02 回复(0)
public int[] moveZeroes (int[] nums) {
        int r=nums.length-1;
        for(int i=nums.length-2;i>=0;i--){
            if(nums[i]==0){
                int l=i;
                for(int j=i+1;j<=r;j++){
                    swap(nums,j,l);
                    l++;
                }
                r--;
            }
           
        }
        return nums;
        // write code here
    }
    void swap(int[] a,int i, int j){
        int t=a[i];
        a[i]=a[j];
        a[j]=t;
    }
编辑于 2024-04-15 21:28:47 回复(0)
using System;
using System.Collections.Generic;

class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型一维数组
     * @return int整型一维数组
     */
    public List<int> moveZeroes (List<int> nums) {
        // write code here
        List<int> lsZ = nums.FindAll(r => r == 0);
        nums.RemoveAll(r => r == 0);
        nums.AddRange(lsZ);
        return nums;
    }
}
发表于 2024-03-29 23:58:51 回复(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
        ArrayList<Integer> list1=new ArrayList<>();
        ArrayList<Integer> list2=new ArrayList<>();
        for(int i=0;i<nums.length;i++){
            if(nums[i]!=0){
                list1.add(nums[i]);
            }else{
                list2.add(nums[i]);
            }
        }
        for(int i=0;i<list2.size();i++){
            list1.add(list2.get(i));
        }
        int arr[]=new int[list1.size()];
        for(int i=0;i<arr.length;i++){
            arr[i]=list1.get(i);
        }
        return arr;
    }
}

发表于 2023-05-20 09:00:27 回复(0)
  1. 如果考虑申请相同大小的数组,遍历将所有的非零元素copy到新数组的前端部分,然后剩余所有的元素赋值为0。
  2. 如果就地调整,那么不断将0元素之后的首个非0元素和第一个0元素交换位置即可。
class Solution {
public:
    vector<int> moveZeroes(vector<int>& nums) {
        int zero_pos = -1;
        for (int i = 0; i < nums.size(); i++) {
            if (nums[i] == 0 && zero_pos == -1) {
                zero_pos = i;
            }
            if (zero_pos != -1 && nums[i] != 0) {
                swap(nums[zero_pos], nums[i]);
                zero_pos++;
            }
        }

        return nums;
    }
};


发表于 2023-05-13 17:52:33 回复(0)
看大部分的解题思路都使用了新的空间,我的思路是采用双指针,一个遍历指针,另一个则指向遍历指针后面第一个可能不为0的位置,如果第二个指针结束了,那么整个循环也就结束了
public int[] moveZeroes (int[] nums) {
        for (int i  = 0, j = 0; i < nums.length && j < nums.length; ) {
            if (nums[i] != 0) {
                i++;
            } else {
                if (j <= i) {
                    j = i + 1;
                }
                for (; j < nums.length; j++) {
                    if (nums[j] != 0) {
                        nums[i] = nums[j];
                        nums[j++] = 0;
                        break;
                    }
                }
            }
        }
        return nums;
    }


发表于 2023-05-05 23:38:49 回复(0)
package main
import _"fmt"

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @return int整型一维数组
*/
func moveZeroes( nums []int ) []int {
    for i,x:=range nums{
        if x==0{
            for j:=i+1;j<len(nums);j++{
                if nums[j]!=0{
                    nums[i],nums[j]=nums[j],nums[i]
                    break
                }
            }
        }
    }
    return nums
}

发表于 2023-03-06 21:51:42 回复(0)
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @param numsLen int nums数组长度
 * @return int整型一维数组
 * @return int* returnSize 返回数组行数
 */
int* moveZeroes(int* nums, int numsLen, int* returnSize ) {
    // write code here
    int *ans=(int *)malloc(sizeof(int)*2000);
    *returnSize=numsLen;
    int k=0;
    //int j=numsLen;
    int i=0;
    for(k=0;k<numsLen;k++){
        if(nums[k]!=0){
            ans[i++]=nums[k];
        }
    }
    for(int j=i;j<numsLen;j++)
         ans[j]=0;
    // for(k=0;k<numsLen;k++){
    //     if(nums[k]==0){
    //         ans[j++]=0;
    //     }
    //     else{
    //         ans[i++]=nums[k];
    //     }
    // }
    // memmove(ans+i, ans+numsLen,(j-numsLen)*sizeof(int));
    return ans;
}

发表于 2022-12-23 22:24:15 回复(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)
class Solution:
    def moveZeroes(self , nums: List[int]) -> List[int]:
        # write code here
        return sorted(nums, key=lambda x:x==0)

发表于 2022-07-09 06:40:42 回复(0)
class Solution:
    def moveZeroes(self , nums: List[int]) -> List[int]:
        if len(nums) == 0:
            return None
        j = 0
        # j 作为慢指针,用来在第一次遍历数组时(i向后移动时)来给非零元素赋值。每当i指针所指
        # 元素非0,则将其赋值给j所指位置,j后移1位
        for i in range(len(nums)):
            if nums[i] != 0:
                nums[j] = nums[i]
                j += 1
        # j目前所指位置开始往后都赋0即可
        for k in range(j, len(nums)):
            nums[k] = 0
        return nums

发表于 2022-06-19 10:37:22 回复(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 {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型一维数组
     */
    public int[] moveZeroes (int[] nums) {
        // write code here
        int slow = 0, fast = 0;
        while(fast < nums.length){
            if(nums[fast] != 0){
                nums[slow++]=nums[fast++];
            }else {
                fast++;
            }
        }
        for(int i=slow;i<nums.length;i++){
            nums[i]=0;
        }
        return nums;
    }
}

发表于 2022-05-10 21:17:56 回复(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)
class Solution:
    def moveZeroes(self , nums: List[int]) -> List[int]:
        # write code here
        count = 0
        res = []
        for n in nums:
            if n == 0:
                count += 1
            else:
                res.append(n)
                
        return res + [0]*count

发表于 2022-04-21 17:25:50 回复(0)
#coding:utf-8
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 思路就是死循环遍历,直到把0放最后的次数等于里面的0的总数停下,而且每次找到0的时候下标要减1,否则下标继续加1.
# @param nums int整型一维数组 
# @return int整型一维数组
#
class Solution:
    def moveZeroes(self , nums ):
        # write code here
        c=0
        i=0
        while c!=nums.count(0):
            
            if nums[i]==0:
                del nums[i]
                nums.append(0)
                c+=1
                i-=1
            i+=1
        return nums
发表于 2022-04-09 23:05:12 回复(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)

问题信息

难度:
33条回答 1411浏览

热门推荐

通过挑战的用户

查看代码