📜  C测验– 109 |问题2(1)

📅  最后修改于: 2023-12-03 15:14:25.947000             🧑  作者: Mango

C测验-109 | 问题2

问题描述

在C++中,给定一个整数数组nums,编写一个函数来移动所有0的元素到它们的数组末尾,同时保持非零元素的相对顺序。

示例:

输入:nums = [0,1,0,3,12]
输出:[1,3,12,0,0]
解法思路

遍历数组,用一个指针来记录非零元素需要插入的位置,将非零元素依次放在该位置上,最后在指针位置后面补0即可。

解法步骤
  1. 定义一个指针pos来记录非零元素需要插入的位置,初始化为0。
  2. 遍历数组,如果当前元素不为0,则将该元素放到nums[pos]的位置上,并将指针pos加1。
  3. 遍历结束后,在指针pos的位置后面补0。

代码实现如下:

void moveZeroes(vector<int>& nums) {
    int pos = 0;
    for (int i = 0; i < nums.size(); i++) {
        if (nums[i] != 0) {
            nums[pos++] = nums[i];
        }
    }
    while (pos < nums.size()) {
        nums[pos++] = 0;
    }
}
复杂度分析

时间复杂度:O(n),其中n为数组的长度,需要遍历一次整个数组。

空间复杂度:O(1),只需要常数空间来记录指针和临时变量。

测试用例

本题测试用例涵盖了数组中有0和无0两种情况。

| 输入 | 输出 | | --------- | --------- | | [0,1,0,3,12] | [1,3,12,0,0] | | [0,0,0] | [0,0,0] | | [1,2,3,4,5] | [1,2,3,4,5] | | [0,0,1,0,1,0,1] | [1,1,1,0,0,0,0] |

总结

本题是一道数组题目,需要用指针来记录操作的位置,操练对数组操作的细节。