验证向量的元素在未定义的范围内是否相同?

时间:2017-01-11 19:35:59

标签: c++

例如,我的号码是22333333255545.我想删除3和5的序列。之后,数字是22245,所以2的序列应该被删除,依此类推,直到没有3的序列或更多相等的数字。我知道只有3个元素相同的情况,我不知道一个未知的数字。

我尝试过的(数字的每个数字都存储在向量v中,vsize是它的初始大小):

for (long long i = 0 ; i < v.size() ; ++i) {
    if (v[i] == v[i+1] && v[i+1] == v[i+2]) {
        v.erase(v.begin() + i, v.begin() + i + 3);
    }
    vsize--;
}

2 个答案:

答案 0 :(得分:0)

如果您创建简单的步骤,这应该很容易:

  1. 保留对序列开头的引用。
  2. 继续前进,直到你再也没有那个序列。
  3. 如果结束序列时,序列引用超过相隔距离,则删除序列。
  4. 通过回滚到最后一个序列的开头来重置开始和结束序列指针。
  5. 继续前行,直至到达向量的末尾。
  6. 这是一些Psuedo代码:

        int maxSeq = n;
        int startSeq = 0, endSeq = 0;
    
        while (startSeq and endSeq < vector.size()) {
            if (vector[++endSeq] != vector[startSeq]) {
                // our sequence has ended.
                if (endSeq - startSeq > maxSeq) {
                    // our sequence is long
                    vector.erase( from startSeq to endSeq)
                    reset startSeq and endSeq by rolling back to the start of the last sequence.
           }
        }
    

答案 1 :(得分:0)

您的问题没有明确指定,如以下序列222333333255545,这取决于您继续执行的顺序会得到不同的结果...如果您开始设置3字符,您将转到222255545,然后尝试2并获取55545,最后您尝试使用5获取45。如果您首先尝试使用2获取333333255545,则会尝试使用3获取255545,最后使用5获取{{1} },这与第一次不同。

首次评论后编辑。

如果你想从左边开始(以贪婪的方式),你要求从左边开始,你别无选择,但找到一个三个或更多相似数字的序列,然后重新开始(在如果你继续你的方法,你可能会错过一些数据。你的方法是一个多遍,你试图在每一遍中找到尽可能多的相似字符:

245

执行到:

#include <iostream>
#include <string>

using namespace std;

string input = "2233333324455545";
const int N = 3;

int main()
{
    cout << input << endl;
    bool finished;
    int pass = 0;
    do {
            finished = true;
            auto i = input.begin();
            while (i + N < input.end()) {
                    auto j = i + 1;
                    while (j < input.end()) {
                            if (*i != *j) break;
                            j++;
                    }
                    if (j >= i + N) {
                            input.erase(i, j);
                            finished = false;
                    } else {
                            i++;
                    }
            }
            cout << input << " after pass #" << ++pass << endl;
    } while (!finished);
} /* main */