- 题目来源:
2010年哈尔滨工业大学计算机研究生机试真题
-
题目描述:
输入一个数n,然后输入n个数值各不相同,再输入一个值x,输出这个值在这个数组中的下标(从0开始,若不在数组中则输出-1)。
-
输入:
测试数据有多组,输入n(1<=n<=200),接着输入n个数,然后输入x。
-
输出:
对于每组输入,请输出结果。
-
样例输入:
2
1 3
0 -
样例输出:
-1
本题的数据的范围较小,简单的我们可以将输入的数据存储在一个数组中,然后线性查找整个数组来找到要找的数的下标,若不存在就输出-1.
AC代码为:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
//线性查找方式
int main()
{
int n;
int buf[1000];
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
scanf("%d",&buf[i]);
}
int x;
int ans=-1;
scanf("%d",&x);
for(int i=0;i<n;i++){
if(x==buf[i]){
ans=i;
break;
}
}
printf("%d",ans);
}
return 0;
}
/*
2
1 3
0
*/
当输入的数据较多时,线性查找的效率就会有点低,那么选择另一种常见的查找方法-二分查找;二分查找是建立在带查找的元素有序的前提上
示例过程如下:
二分查找有两种实现方式,递归和非递归的方式,实现代码为:
//非递归方式实现二分查找
int binarySearch(int arr[],int key){
int mid;
int start=0;
int end = getArrayLen(arr)-1;
while(start<end){
mid=(start+end)/2+start;
if(arr[mid]==key)
return mid;
else if(key<arr[mid]){
end=mid-1;
} else if(key>arr[mid]){
start=mid+1;
}
}
return -1;
}
//递归方式实现二分查找
int binarySearch_recursion(int arr[],int start,int end,int key){
int mid;
while(start<end){
mid=(start+end)/2+start;
if(arr[mid]==key)
return mid;
else if(key<arr[mid]){
end=mid-1;
binarySearch_recursion(arr,start,end,key);
} else if(key>arr[mid]){
start=mid+1;
binarySearch_recursion(arr,start,end,key);
}
}
return -1;
}
具体的AC代码为:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
template <class T>
//使用模板定义一 个函数getArrayLen,该函数将返回数组array的长度
int getArrayLen(T& array){
return (sizeof(array) / sizeof(array[0]));
}
int main()
{
int n;
int buf[1000];
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
scanf("%d",&buf[i]);
}
sort(buf,buf+n);
int x;
int ans=-1;
scanf("%d",&x);
//printf("%d",binarySearch(buf,x));
printf("%d",binarySearch_recursion(buf,0,getArrayLen(buf)-1,x));
}
return 0;
}
由于C和C++中没有提供直接获取数组长度的函数,对于存放字符串的字符数组提供了一个strlen函数获取长度,那么对于其他类型的数组通常使用sizeof(array) / sizeof(array[0]), 在C语言中习惯上在 使用时都把它定义成一个宏,比如#define GET_ARRAY_LEN(array,len) {len = (sizeof(array) / sizeof(array[0]));} 。而在C++中则可以使用模板 技术定义一个函数:
int getArrayLen(T& array){
return (sizeof(array) / sizeof(array[0]));
}
参考链接:C和C++如何获取数组长度