如何压缩vector中连续重复的零并保留未删除元素的索引?
连续重复零压缩与原索引记录实现方案
核心思路
遍历原向量A,通过一个标记变量跟踪前一个元素是否为零,以此决定当前元素是否保留:
- 若当前元素非零:直接加入结果向量
B,同时记录当前索引到Index - 若当前元素是零:仅当前一个元素不是零的时候,才将该零和对应索引加入结果,自动跳过后续连续的零
C++ 代码实现
#include <vector> using namespace std; void compressConsecutiveZeros(const vector<int>& A, vector<int>& B, vector<int>& Index) { B.clear(); Index.clear(); if (A.empty()) return; bool prev_zero = false; for (int i = 0; i < A.size(); ++i) { if (A[i] != 0) { B.push_back(A[i]); Index.push_back(i); prev_zero = false; } else { if (!prev_zero) { B.push_back(0); Index.push_back(i); prev_zero = true; } // 连续的零直接跳过,不加入结果 } } } // 测试示例 #include <iostream> int main() { vector<int> A = {1, 2, 0, 0, 0, 1, 0, 1}; vector<int> B, Index; compressConsecutiveZeros(A, B, Index); // 输出B cout << "B = {"; for (size_t i = 0; i < B.size(); ++i) { if (i > 0) cout << ", "; cout << B[i]; } cout << "}\n"; // 输出Index cout << "Index = {"; for (size_t i = 0; i < Index.size(); ++i) { if (i > 0) cout << ", "; cout << Index[i]; } cout << "}\n"; return 0; }
代码说明
- 初始化:先清空
B和Index,处理空输入的边界情况 - 标记变量
prev_zero:初始为false,确保第一个元素如果是零也能被正确保留 - 遍历逻辑:
- 遇到非零元素时,直接存入结果,并更新标记为非零状态
- 遇到零时,仅当之前没有连续零(
prev_zero为false)时才存入结果,同时将标记设为true,后续连续零会被跳过
- 测试部分:验证示例输入,输出符合预期的
B和Index
内容的提问来源于stack exchange,提问作者Paul Aner
相关产品推荐
相关产品推荐

