将数组中的零移动到末尾
move zeros in an array to the end
>"这个问题属于"数组转换"的广泛类别。这个类别是技术面试的肉。主要是因为数组是一种简单易用的数据结构。遍历或表示不需要任何样板代码,大多数代码看起来像伪代码本身。
问题的 2 个要求是:
将所有 0 移到数组的末尾。
所有非零元素必须保留其原始顺序。
我的想法: 找到零并将其位置与最后一个数字交换
/* int swap;
int n=nums.size()-1;
for(int i=0;i<nums.size();i--){
if(nums[i]==0){
swap = nums[i];
nums[i] = nums[n];
nums[n] = swap;
n--;
}
}
我的输入 [0,1,0,3,12] 输出 [1,3,12,0,0] 差异 预期 [1,3,12,0,0]
而且我不知道为什么正确答案(部分(是:
(int n = 0, cur = 0; cur < nums.size(); cur++) {
if (nums[cur] != 0) {
swap(nums[n++], nums[cur]);
}
}
}
您可以使用标准库吗?std::stable_partition()
使它变得微不足道。类似的东西
std::stable_partition(nums.begin(), nums.end(),
[](const auto &n){ return n != 0; });
对于帖子中的解决方案如何工作的问题:
在第一次迭代开始时,n 为 0,cur 为 0,nums 为 [0,1,0,3,12]。nums[cur]
为 0,因此不会发生任何操作。在第二次迭代开始时,cur 为 1,nums[cur]
为 1,因此会发生 n 的交换和增量。
现在 n 是 1,cur 是 2,nums 是 [1,0,0,3,12]。nums[cur]
为 0,因此在第三次迭代中不会发生任何操作。在第四次迭代中,cur 现在为 3,会发生交换。因此,在第五次迭代开始时,n 为 2,cur 为 4,nums 为 [1,3,0,0,12]。我会把它留给你来解决这一步会发生什么。
基本上,当 n 不等于 cur 时,它是 0 元素的索引,可以与 cur 作为其索引的非 0 元素交换。这种交换最终将所有 0 移到最后。
我对这个问题的看法,最少的 std 库使用。 可能不是最有效的,但它确实可以解决问题。
#include "stdafx.h"
#include <iostream>
int main()
{
int src[] = { 0, 1, 0, 3, 0, 12 }; // Output: 1 3 12 0 0 0 check
// = { 0, 3, 0, 1, 0, 0, 12, 0, 5 }; // Output: 3 1 12 5 0 0 0 0 0 check
int n = sizeof(src) / sizeof(src[0]);
for (int x = 0; x < n; x++) {
for (int y = x + 1; y < n; y++) {
if (src[x] == 0 && src[y] != 0) {
int swap = src[x];
src[x] = src[y];
src[y] = swap;
}
}
}
for (int i = 0; i < n; i++) {
std::cout << src[i] << " ";
}
return 0;
}
相关文章:
- 移动二维数组中的字符
- 新的整数数组向右移动?
- 当 std::move 与 C 样式数组或不移动对象时会发生什么
- 在数组中输入 n 个整数的列表,并以类似于钟摆来回移动的方式排列它们. 输入-1 3 2 5 4,输出5 3 1 2 4
- 数组指针表示法C++(移动数组时)
- C++ - 块不移动,我的数组不起作用
- 如何将数组中的元素向右移动?
- 如何将不可移动和不可复制的函数返回值获取到数组中
- 尝试通过多个函数移动数组,但遇到了我不知道如何修复的错误
- 移动数组C++中的特定元素
- 在 C++ 中移动数组元素
- C++移动数组元素的正确方法aligned_storage
- 移动数组指针未更改开始的地址
- 使用memcpy移动数组并在给定位置插入一个新元素
- 如何移动数组中的元素,将奇数放到数组的开头(从最小到最大),甚至放到后面(从最大到最小)
- 单独移动数组(raw array, std::array, std::vector)的每个元素
- 向下移动数组值1
- c++中移动数组的函数
- 移动数组中字符串的位置
- 移动数组元素