Leetcode Hot100系列283移动零

本文介绍了如何使用双指针解决LeetCode热门题目283——移动零。作者首先阐述了基本思路,即通过左右两个指针,保持左指针左侧都是非零数,然后逐步将非零数与右指针找到的零交换。接着给出了两种不同的代码实现,一种简洁明了,另一种虽然复杂但能解决问题。作者反思了自己的解题过程,强调清晰的思路对于编写算法代码的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. leetcode Hot100-283.移动零

1.1 思路

  • 使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移
    • 左指针左边的均为非零数
    • 右指针左边直到左指针处均指向0
  • 因此,每次交换都是将左指针的零与右指针的非零数交换,且非零数的相对位置没有改变。

1.2 代码实现

class Solution {
    public void moveZeroes(int[] nums) {
    	int left = 0;
    	int right = 0;
    	while(right < nums.length) {
    		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;
    }
}

1.3 我的思路与感受

  • 我每次做题都会首先想到那种特殊情况,比如左右指针一开始都不为0,就要将左右指针同时向后移,直到找到为0的点才开始交换,然后会考虑左指针找到位置后,右指针也应该找到第一个不为0的点,然后才开始交换。这样就将问题复杂化,提前进行一些剪枝操作。我的代码如下:
class Solution {
    public void moveZeroes(int[] nums) {
        int left = 0;
        int right = 1;
        int n = nums.length;
        while(left < n && right < n) {
            if (nums[left] != 0) {
                left++;
                right++;
            } else {
                while (right < n && nums[right] == 0) {
                    right++;
                }
                if (right == n) 
                    break;
                else {
                    nums[left] = nums[right];
                    nums[right] = 0;
                }
            }
        }    
    }
}
  • 其实,等我写完代码之后,我看我自己代码的时候也会觉得我的代码思路混乱,根本没有逻辑。只能佛系提交,看看能否通过。
  • 写算法题首先要理清思路,然后才开始写代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值