Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 验证向量的元素在未定义的范围内是否相同?_C++ - Fatal编程技术网

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

C++ 验证向量的元素在未定义的范围内是否相同?,c++,C++,例如,我的电话号码是22333333255545。我想删除3和5的序列。在此之后,数字是22245,因此2的序列应该被删除,依此类推,直到没有3个或更多相等数字的序列。我只知道当只有3个元素相等时,我不知道未知数 我尝试过的(数字的每个数字都存储在向量v中,vsize是它的初始大小): for(长i=0;i获取45。如果先尝试使用2获取333333255545,然后尝试使用3获取255545,最后使用5获取245,这与第一次不同 在第一条评论后编辑。 如果你想从左边开始(以贪婪的方式),如果你要

例如,我的电话号码是22333333255545。我想删除3和5的序列。在此之后,数字是22245,因此2的序列应该被删除,依此类推,直到没有3个或更多相等数字的序列。我只知道当只有3个元素相等时,我不知道未知数

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

for(长i=0;i
如果您创建以下简单步骤,这应该很容易:

  • 保留对序列开头的引用
  • 继续前进,直到你不再有那个序列
  • 如果在结束序列时,序列引用之间的距离大于距离,请删除序列
  • 通过回滚到最后一个序列的开始,重置开始和结束序列指针
  • 一直走到向量的末端 以下是一些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.
           }
        }
    
    int-maxSeq=n;
    int startSeq=0,endSeq=0;
    while(startSeq和endSeqmaxSeq){
    //我们的序列很长
    矢量擦除(从startSeq到endSeq)
    通过回滚到最后一个序列的开始来重置startSeq和endSeq。
    }
    }
    
    您的问题没有很好地说明,因为在下面的顺序中,
    2223333255545
    ,这取决于您进行操作的顺序,您将得到不同的结果…如果您开始获取
    3
    字符,您将获得
    2255545
    ,然后尝试使用
    2
    55545
    ,最后尝试使用
    5de>获取
    45
    。如果先尝试使用
    2
    获取
    333333255545
    ,然后尝试使用
    3
    获取
    255545
    ,最后使用
    5
    获取
    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 */
    

    你想做什么?找到唯一不重复的数字吗?
    @NathanOliver中有一个函数,这就是我想做的:计算向量,删除重复的数字,再次计算,再次删除重复的数字,等等,直到没有重复的数字。@lcs,你能解释一下如何使用这个函数吗关于我所写的示例编号的问题?从您提供的链接中我不明白。22233324应该减少到24还是4?(22233324->33324->24,或22233324->22224->4?)你能解释得更好吗?我是C++初学者。@ USS795692我提供了一些pSueDO代码,但是这显然是家庭作业,所以你需要能够通过“重启StestSeq和EnESEQ,通过滚动回到最后一个序列的开始来处理这个你自己的问题”。你的意思是startSeq=0和endSeq=0?那么n是什么?向量的大小?@user7395692不是我的意思,我的意思是回到最后一个序列的开头。n是你想要的任何东西。这是psuedo代码,你需要实现一些东西并调试它,这是你学习的唯一方法。我希望程序像这样工作:找到第一个序列,删除它。重新计算数字,找到第一个序列,删除它,依此类推。
    
    #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 */
    
    $ greedy 
    2233333324455545
    2224445 after pass #1
    5 after pass #2
    5 after pass #3