You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何压缩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;
}

代码说明

  1. 初始化:先清空B和Index,处理空输入的边界情况
  2. 标记变量prev_zero:初始为false,确保第一个元素如果是零也能被正确保留
  3. 遍历逻辑:
    • 遇到非零元素时,直接存入结果,并更新标记为非零状态
    • 遇到零时,仅当之前没有连续零(prev_zero为false)时才存入结果,同时将标记设为true,后续连续零会被跳过
  4. 测试部分:验证示例输入,输出符合预期的B和Index

内容的提问来源于stack exchange,提问作者Paul Aner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 05:05:02