C++11 for循环的新写法(用于实现LeetCode238.移除零)
发布日期:2021-05-20 07:54:52 浏览次数:19 分类:精选文章

本文共 1321 字,大约阅读时间需要 4 分钟。

C++11 for循环的新写法

1. 示例代码

在C++11更新中,for循环的写法得到了简化,更加简洁和易于理解。以下是示例代码:

#include 
#include
using namespace std;
int main() {
vector
numbers = {3, 4, 5, 6, 0, 2, 4};
for (int num : numbers) {
if (num != 0) {
cout << num << " ";
}
}
return 0;
}

2. 运行结果

运行上述代码,输出结果为:3 4 5 6 2 4,即去掉了零,保留了非零元素的顺序。

实现LeetCode238:移除零

1. AC代码

传统的解法是使用双重循环,逐步收集非零元素,排除零。

class Solution {
public:
void moveZeroes(vector
& nums) {
int index = 0;
for (int num : nums) {
if (num != 0) {
nums[index++] = num;
}
}
int len = nums.size();
while (index < len) {
nums[index++] = 0;
}
}
};

2. 大佬代码

另一种高级方法使用了C++的stable_partition函数来实现这一操作。

class Solution {
public:
void moveZeroes(vector
& nums) {
stable_partition(nums.begin(), nums.end(), [](int a) {
return a != 0;
});
}
};

解题思路

使用事务式stable_partition函数,它会将区间内满足给定条件的元素前置非零元素,而零全保留在后边,同时保持非零元素的初始顺序。这样就可以在O(n)时间复杂度内完成任务,避免了传统双重循环的O(n^2)效率问题。

扩展知识:常用的vector初始化方式

向量初始化有多种方式,常用方式包括:

  • 使用大小和值初始化:
vector
vec(n, 0);
  • 指定初始值或元素:
vector
vec = {1, 3, 2, 5, 7};
  • 从其他数据结构初始化:
vector
vec(otherVec.begin(), otherVec.end());

这些初始化方式根据具体需求选择,灵活和高效。

上一篇:partition函数和stable_partition函数的小示例
下一篇:实现n皇后问题的多种解法

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2025年05月16日 20时30分37秒