我试图找到一种从一系列数字中提取满足条件的最长序列的方法:每个数字必须是其后面的数字的前缀。
Ex:对于系列:523,742,7421,12,123,1234,87
,它应显示12,123,1234
。
我想过将系列存储在一个向量中然后迭代它并在另一个向量中移动满足条件的数字。但是,我坚持选择最长的序列(12,123,1234
而不是上面例子中的742, 7421
)。这是我到目前为止编写的代码:
bool prefix(int a, int b){
if ((b / 10 - ((b % 10)) / 10) == a)
return 1;
else return 0;
}
vector<int> choose_sequence(vector<int> &series){
vector<int> right_sequence;
int count = 0;
for (int i = 0; i < series.size();){
for (int j = i + 1; j < series.size();){
if (prefix(series.at(i), series.at(j))){
right_sequence.push_back(series.at(i));
right_sequence.push_back(series.at(j));
i=j;
j++;
}
else
i++;
}
}
return right_sequence;
}
任何建议或更正都是受欢迎的,也是最受欢迎的。另外,如果您知道使用其他数据类型而不是矢量更好的方法,请分享。
答案 0 :(得分:0)
我认为解决这个问题的经典方法是创建第二个向量,它将为每个位置包含在该位置结束的序列的长度以及序列中前一个元素的位置(如果没有先前的元素)。 对于您的示例,向量将类似于: 计数:1,1,2,1,2,3,1 prev:-1,-1,1,-1,3,4,-1
您将从计数中选择最大值,并使用prev。
确定序列所以,我们的最大值是3,位置是5,相应的元素是1234。 前一个元素位于原始向量中的位置4,值为123。 前一个元素位于第3位,值为12。 前一个元素位于-1位置,这意味着没有前一个元素,所以我们有序列:12,123,1234。
另一种方法是尝试设置从某个位置开始的序列的长度和下一个元素的位置。你将会拥有: 计数:1,2,1,3,2,1,1 next:-1,2,-1,4,5,-1,-1
我们的最大值再次为3,但现在我们有序列的第一个元素(位置3,值12)。下一个元素位于第4位(值为123)。下一个元素位于第5位(值为1234)。下一个元素位于-1位置,这意味着我们到达了序列的末尾。
这种方法的优点是序列是以“正确”的顺序生成的。
答案 1 :(得分:0)
您可以在没有任何额外内存的情况下执行此操作,并且只能对输入向量进行一次遍历。
std::vector<int> longestSequence(const std::vector<int>& numbers)
{
std::vector<int> result;
if (numbers.empty())
return result;
size_t longestStart = 0, longestLength = 0;
size_t start = 0;
for (size_t i = 1, imax = numbers.size(); i < imax; ++i) {
if (numbers[i] / 10 != numbers[i - 1]) {
if (i - start > longestLength) {
longestStart = start;
longestLength = i - start;
}
start = i;
}
}
if (numbers.size() - start > longestLength) {
longestStart = start;
longestLength = numbers.size() - start;
}
result.assign(begin(numbers) + longestStart, begin(numbers) + longestStart + longestLength);
return result;
}