我有这个功能:
int findnext(int nr,int counter,int v[]){
int i,newnr=-1;
for(i = counter-1; i >= 0; i--){
if(v[i] > nr){
newnr = v[i];
}
}
if(newnr == -1) return -1;
else return newnr;
}
这个函数的作用是,它在数组中找到下一个更大的数字,如果它找不到一个,则返回-1;我想要做的是,在我的主要课程中使用这个之后......
int main(){
int a=1;counter=3;
int v[3]={-1,2,3}; //v[0] is -1 because a=1
a = findnext(a,counter,v);
}
...用-1替换主类中的v [1](因为它发现下一个大数字为2)并将v [0]上的-1替换为1(变量a之前是什么) )。这可能吗?
提前谢谢!
额外信息:
int v [5]可以是{1,1,3,3,4}开头(它可以有多个相同的元素)
int v [5]可以{1,4,6,7,9}开头(不是{1,2,3,4,5 ...})
数组已排序。
如果函数的结果是-1,那么它会使数组进入原始状态
数组永远不会有一个小于0的数字。
示例:
该计划以: v [5] = {1,6,7,9,9};和a = -1;
我执行函数:a = 1; v [5] = { - 1,6,7,9,9};
我再次执行它:a = 6; v [5] = {1,-1,7,9,9};
我再次执行它:a = 7; v [5] = {1,6,-1,9,9};
我再次执行它:a = 9; v [5] = {1,6,7,-1,9-};
我再次执行它:a = 9; v [5] = {1,6,7,9,-1};
我再次执行它:a = -1; v [5] = {1,6,7,9,9);
答案 0 :(得分:0)
试试这段代码。解决此问题的最佳方法是记住旧的替换值和索引,并在进行新更改时将其替换回来。
这里我使用了c ++ 11 initializer_list来简化初始化。
#include<iostream>
#include<string>
#include<vector>
#include<sstream>
#include<iterator>
#include<initializer_list>
using namespace std;
template <int t> class Selectable
{
int index;
int value;
int v[t];
public:
Selectable() : index(-1), value(-1)
{
}
Selectable(initializer_list<int> x) : index(-1), value(-1)
{
copy(x.begin(), x.begin() + t, v);
}
int selectNext(int n)
{
if (index + 1 == t)
{
v[index] = value;
index++;
}
cout << endl << index;
for (int i = index + 1; i < t; i++)
{
// cout<<v[i];
if (v[i] > n)
{
if (index >= 0)
{
v[index] = value;
}
index = i;
value = v[i];
v[i] = -1;
show();
return 1;
}
}
show();
return -1;
}
void show()
{
copy(v, v + t, ostream_iterator<int>(cout, "\t"));
}
};
int main()
{
Selectable<5> s;
s = {2, 3, 2, 3, 2};
cout<<s.selectNext(-1)<<endl;
cout<<s.selectNext(-1)<<endl;
cout<<s.selectNext(-1)<<endl;
cout<<s.selectNext(-1)<<endl;
cout<<s.selectNext(-1)<<endl;
cout<<s.selectNext(-1)<<endl;
cout<<s.selectNext(-1)<<endl;
cout<<s.selectNext(-1)<<endl;
return 0;
}