来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/move-zeroes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
- 五遍刷题第一遍–1221
- 五遍刷题第二遍–1223–用时1h
题目描述
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。
方法
- 双指针法(经常用到)
C++知识点
void moveZeroes(vector<int>& nums)
- 函数的定义
类型说明符 函数名(含类型说明的形式参数表)
{
语句序列
}
空函数
没有返回值的函数,void
函数传递参数的方式
按值传递
按引用传递 本例中就是按引用传递 &
详见C++ Primer Plus或者如下链接:
https://blog.csdn.net/weixin_43692909/article/details/96020572
https://www.cnblogs.com/ruo-li-suo-yi/p/8719528.html
- vector 定义
定义名为a的vector类型
vector<int> a
代码难点
代码
- 双指针法
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int j = 0;
for (int i = 0; i < size(nums); ++i){
if (nums[i] !=0){
nums[j] = nums[i];
if(i!=j){
nums[i]=0;
}
j++;
}
}
}
};
- 简化版代码(方法相同)
class Solution{
public:
void moveZeroes(vector<int>& nums) {
for (int lastNonZeroFoundAt = 0, cur = 0; cur < nums.size(); cur++){
if (nums[cur] != 0){
swap (nums[lastNonZeroFoundAt++], nums[cur]);
}
}
}
};