例如,我的号码是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--;
}
答案 0 :(得分:0)
如果您创建简单的步骤,这应该很容易:
这是一些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 */