我遇到一个问题,要求我打印差值最小的整数的索引。 如果输入是5
和10 12 13 15 10
,我必须打印5 1
。 问题就在这里。 下面是我的代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
int n;
int temp=1005,pos1=0,pos2=0;
cin>>n;
vector <int> vec;
for(int i=0;i<n;i++){
int in; cin>>in;
vec.push_back(in);
}
for(int i=0;i<n;i++){
for(int j=1;j<n;j++){
if(i==j)break;
int ans=abs(vec[i]-vec[j]);
cout<<i+1<<"-"<<j+1<<" = "<<ans<<endl;
if(ans<temp){
temp=ans;
pos1=i,pos2=j;
}
}
}
cout<<pos1+1<<" "<<pos2+1<<endl;
return 0;
}
士兵们站成一个圆圈,你应该看着挨着站着的士兵。
这意味着您不需要j循环。 您可以简单地将vec[i]
与vec[(i+1)%n]
进行比较。
这是我在C中的解决方案。记住,你只需要关注邻近的元素,并且士兵被组织成一个圆圈。 另外,我发现有点奇怪的是,解决方案要求索引从1开始,而不是从0开始。
#include <stdio.h>
#define ABS(n) ((n) * (((n) > 0) - ((n) < 0)))
void solution(int n, int soldiers[static 2])
{
int indexA = 1,
indexB = 2,
minDiff = ABS(soldiers[0] - soldiers[1]),
heightDiff;
for (int i = 1; i < n; i++)
{
if ((heightDiff = ABS(soldiers[i] - soldiers[(i + 1) % n])) < minDiff)
{
minDiff = heightDiff;
indexA = i + 1;
indexB = ((i + 1) % n) + 1;
}
}
printf("%d %d\n", indexA, indexB);
}
int main()
{
solution(5, (int[5]){10, 12, 13, 15, 10});
//5 1
solution(4, (int[4]){10, 20, 30, 40});
//1 2
return 0;
}