螺竹编程
发布于 2024-05-25 / 3 阅读
0

算法题/双指针:把数组中的0移动到末尾

题目

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

示例1:

输入:[0, 1, 0, 3, 12]
输出:[1, 3, 12, 0, 0]
解释:元素0移动到了末尾,且非零元素保持原有顺序不变

解答1:

Java

class Solution {
    public void moveZeroes(int[] nums) {
        int n = nums.length, left = 0, right = 0;
        while (right < n) {
            if (nums[right] != 0) {
                nums[left]=nums[right];
                left++;
            }
            right++;
        }
        //非0元素统计完了,剩下的都是0了
        //所以第二次遍历把末尾的元素都赋0即可
        for(int i=left;i<nums.length;i++){
            nums[i]=0;
        }
    }  
}

JavaScript

class Solution {
    moveZeroes(nums) {
        let n = nums.length;
        let left = 0;
        let right = 0;
        while (right < n) {
            if (nums[right] !== 0) {
                nums[left] = nums[right];
                left++;
            }
            right++;
        }
        // 非0元素统计完了,剩下的都是0了
        // 所以第二次遍历把末尾的元素都赋0即可
        for (let i = left; i < nums.length; i++) {
            nums[i] = 0;
        }
    }
}

Python

class Solution:
    def moveZeroes(self, nums):
        n = len(nums)
        left = 0
        right = 0
        while right < n:
            if nums[right] != 0:
                nums[left] = nums[right]
                left += 1
            right += 1
        # 非0元素统计完了,剩下的都是0了
        # 所以第二次遍历把末尾的元素都赋0即可
        for i in range(left, len(nums)):
            nums[i] = 0

Go

package main

type Solution struct{}

func (s *Solution) moveZeroes(nums []int) {
	n := len(nums)
	left := 0
	right := 0
	for right < n {
		if nums[right] != 0 {
			nums[left] = nums[right]
			left++
		}
		right++
	}
	// 非0元素统计完了,剩下的都是0了
	// 所以第二次遍历把末尾的元素都赋0即可
	for i := left; i < len(nums); i++ {
		nums[i] = 0
	}
}

func main() {
	// 示例用法
	nums := []int{0, 1, 0, 3, 12}
	s := Solution{}
	s.moveZeroes(nums)
	fmt.Println(nums)
}