1052:找x

74 阅读1分钟
  • 题目来源:

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++如何获取数组长度