王道机试例题3.5 查找
题目描述
输入数组长度 n 输入数组 a[1…n] 输入查找个数m 输入查找数字b[1…m] 输出 YES or NO 查找有则YES 否则NO 。
输入描述:
输入有多组数据。
每组输入n,然后输入n个整数,再输入m,然后再输入m个整数(1<=m,n<=100)。
输出描述:
如果在n个数组中输出YES否则输出NO。
示例1
输入
5
1 5 2 4 3
3
2 5 6
输出
YES
YES
NO
代码
#include <iostream>
#include<stdio.h>
const int maxn = 100;
int arr1[maxn];
int arr2[maxn];
bool search(int x,int n) { //二分查找
int left=0, right=n-1, mid;
mid = (left + right) / 2;
while (left <= right) {
if (arr1[mid] == x) {
return true;
}
else if (arr1[mid] > x) {
right = mid - 1;
mid = (left + right) / 2;
}
else {
left = mid + 1;
mid = (left + right) / 2;
}
}
return false;
}
int main()
{
int n,m;
while (scanf("%d", &n) != EOF) {
for (int i = 0; i < n; i++) {
scanf("%d", &arr1[i]);
}
scanf("%d", &m);
for (int i = 0; i < m; i++) {
scanf("%d", &arr2[i]);
}
//多次查找,二分查找的性能会优于线性查找
//排序 升序
for (int i = 0; i < n; i++) {
for (int j = n - 1; j > i; j--) {
if (arr1[j] < arr1[j - 1]) {
int temp = arr1[j];
arr1[j] = arr1[j - 1];
arr1[j - 1] = temp;
}
}
}
for (int i = 0; i < m; i++) {
if (search(arr2[i], n)) {
printf("YES\n");
}
else {
printf("NO\n");
}
}
}
}
注意
int mid=(left+right)/2。通常情况下,这是对的,也很容易理解。
不过,如果left和right非常接近整形最大值,这时求中间值就会出现溢出问题,因此要用代码int mid=left+(right-left)/2代替。二者功能等价,并且后者不会出现溢出现象。