题目描述
输入一个数n,然后输入n个数值各不相同,再输入一个值x,输出这个值在这个数组中的下标(从0开始,若不在数组中则输出-1)。
输入
测试数据有多组,输入n(1<=n<=200),接着输入n个数,然后输入x。
输出
对于每组输入,请输出结果。
样例输入
4 1 2 3 4 3
样例输出
2
用二分法的前提是数组是有序的,我利用了结构体,变量x代表下标,y代表数值,通过对y进行从小到大的排序,输出对应的x下标,最后WA可能是因为如果存在一样的数值,下标的稳定性不能满足。
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=210;
struct Node{
int x,y;
}node[N];
bool cmp(Node a,Node b){
return a.y<b.y;
}
int binarySearch(Node a[],int left,int right,int x){
int mid;
while(left<=right){
mid=(left+right)/2;
if(a[mid].y==x) return a[mid].x;
else if(a[mid].y>x) right=mid-1;
else left=mid+1;
}
return -1;
}
int main(){
int n,x;
cin>>n;
for(int i=0;i<n;i++){
node[i].x=i;
cin>>node[i].y;
}
sort(node,node+n,cmp);
cin>>x;
int cons=binarySearch(node,0,n-1,x);
printf("%d\n",cons);
return 0;
}
简单遍历AC算法:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 210;
int main(){
int n,k;
int a[maxn]={0};
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
scanf("%d",&k);
for(int i=0;i<n;i++){
if(a[i]==k)
{
printf("%d",i);
break;
}
}
if(k==n) printf("-1");
}
return 0;
}