Passion and Patience

Work Hard, Play Hard

导航

Leecode 移动零

Day 6 刷题

我的解题思路:利用双指针,一个指针不断向前移动,表征是否交换完成,另一个指针负责当次交换的位置。
class Solution {
    public void moveZeroes(int[] nums) {
        
        // 当指针p1指向的元素为0时,将其挪到后面
        OUT:
        for(int p1 = 0; p1<nums.length; p1++){
            int p2 = p1;
            if(nums[p1] == 0){
                // 找到最前面不为0的值
                while(nums[p2]==0){
                    p2++;
                    if(p2 >= nums.length){
                        break OUT;
                    }
                }
                nums[p1] = nums[p2];
                nums[p2] = 0;
                p2--;
            }
        }      

    }
}
王尼玛的巧妙解题思路:

用 0 当做这个中间点,把不等于 0的放到中间点的左边,等于 0 的放到其右边。

class Solution {
	public void moveZeroes(int[] nums) {
		if(nums==null) {
			return;
		}
		//两个指针i和j
		int j = 0;
		for(int i=0;i<nums.length;i++) {
			//当前元素!=0,就把其交换到左边,等于0的交换到右边
			if(nums[i]!=0) {
				int tmp = nums[i];
				nums[i] = nums[j];
				nums[j++] = tmp;
			}
		}
	}
}	

巧妙在利用新索引j来重新更新有元素的值!nums[j++] = tmp;

posted on 2024-03-20 11:10  安静的聆  阅读(3)  评论(0编辑  收藏  举报