leetcode-移动零

题目

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

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:

输入: nums = [0]
输出: [0]

我的第一次解答

看错了题目,以为要排序

class Solution {
    public void moveZeroes(int[] nums) {
        int len=nums.length;
		int end=len-1;
		for(int i=0;i<nums.length;i++){
			if(nums[i]==0){
				for(int j=end;j>i;j--){
					if(nums[j]!=0){
						nums[i]=nums[j];
						nums[j]=0;
						end=j-1;
						break;
					}
				}
			}
			if(i+1>=end){
				break;
			}
			if(nums[i+1]==0){
				for(int j=end;j>i+1;j--){
					if(nums[j]!=0){
						nums[i+1]=nums[j];
						nums[j]=0;
						end=j-1;
						break;
					}
				}
			}
			if(nums[i]>0&&nums[i+1]>0&&nums[i]>nums[i+1]){
				int temp=nums[i];
				nums[i]=nums[i+1];
				nums[i+1]=temp;
				for(int j=0;j<i;j++){
					temp=nums[i];
					if(nums[j]>nums[i]){
						for(int k=i;k>j;k--){
							nums[k]=nums[k-1];
						}
						nums[j]=temp;
						break;
					}
				}

			}
		}
		
    }
}

我的第二次解答

class Solution {
    public void moveZeroes(int[] nums) {
        int xx = 0;
        for (int i = 0; i < nums.length; i++) {
            int temp = -1;
            if (nums[i] != 0) {
                for (int j = i - 1; j >= 0; j--) {
                    if (nums[j] == 0) {
                        temp = j;
                    }
                }
                if(temp==-1){
                    continue;
                }
                xx = nums[temp];
                nums[temp] = nums[i];
                nums[i] = xx;
            }
        }

    }
}

官方解答

class Solution {
    public void moveZeroes(int[] nums) {
        int n = nums.length, left = 0, right = 0;
        while (right < n) {
            if (nums[right] != 0) {
                swap(nums, left, right);
                left++;
            }
            right++;
        }
    }

    public void swap(int[] nums, int left, int right) {
        int temp = nums[left];
        nums[left] = nums[right];
        nums[right] = temp;
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/move-zeroes/solutions/489622/yi-dong-ling-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论区有人给出了更好的答案

直接将非0的数字左移即可,再填充剩下的格子为0

public void moveZeroes(int[] nums) {
    int cur = 0;
    for (int i = 0; i < nums.length; i++) {
        if (nums[i] != 0) {
            nums[cur] = nums[i];
            cur++;
        }
    }
    for (int i = cur; i < nums.length; i++) {
        nums[i] = 0;
    }
}
posted @ 2025-05-21 11:32  尼兰  阅读(21)  评论(0)    收藏  举报