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