【发布时间】:2019-09-17 09:40:49
【问题描述】:
令 J 为具有 (0, 1, 1, 2, 3, 5, 8, 3, 1) 值的向量
我想继续从向量中删除奇数位置的所有值,直到 J 只剩下一个元素。
(0, 1, 1, 2, 3, 5, 8, 3, 1) => (1, 2, 5, 3) => (2,3) => (3)
我如何做到这一点?
我的做法:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int J[] = {0, 1, 1, 2, 3, 5, 8, 3, 1};
int len=sizeof(J)/sizeof(J[0]);
vector<int> Jvec;
for (int i=0; i<len; i++) { //Putting the values of array into Jvec
Jvec.push_back(J[i]);
}
while (Jvec.size()!=1) {
vector<int> oddJ;
for (int k=0; k<Jvec.size(); k=k+2) { //Storing values of odd places
oddJ.push_back(Jvec[k]);
}
for (int i=0; i<oddJ.size(); i++) {
Jvec.erase(remove(Jvec.begin(), Jvec.end(), oddJ[i]), Jvec.end()); //removing values from vector by value, not index
}
}
cout << Jvec[0];
return 0;
}
我得到的是 5 而不是 3。我的逻辑有问题吗?我哪里错了?
【问题讨论】:
-
您是否尝试使用调试器?每次擦除调用后向量的值是多少?
-
我可以简单地说答案将是倒数第二个数字吗
-
从奇数地方实际上是指从偶数索引?在 C++ 中,索引从 0 开始。
-
另一种方法是找到 2 的最大幂,小于或等于该位置的元素和打印元素的数量。
标签: c++ arrays algorithm vector lambda