• 九度OJ 1349 数字在排序数组中出现的次数 -- 二分查找


    题目地址:http://ac.jobdu.com/problem.php?pid=1349

    题目描述:
    统计一个数字在排序数组中出现的次数。
    输入:

    每个测试案例包括两行:

    第一行有1个整数n,表示数组的大小。1<=n <= 10^6。

    第二行有n个整数,表示数组元素,每个元素均为int。

    第三行有1个整数m,表示接下来有m次查询。1<=m<=10^3。

    下面有m行,每行有一个整数k,表示要查询的数。

    输出:
    对应每个测试案例,有m行输出,每行1整数,表示数组中该数字出现的次数。

    样例输入:
    81 2 3 3 3 3 4 513
    样例输出:
    4



    #include <stdio.h>
     
    typedef struct timesofdata{
        int data;
        int times;
    }TimesOfData;
     
    int Bsearch (TimesOfData hash[], int start, int end, int k){
        int mid;
     
        while (start <= end){
            mid = (start + end) / 2;
            if (hash[mid].data < k)
                start = mid + 1;
            else if (hash[mid].data > k)
                end = mid - 1;
            else
                return hash[mid].times;
        }
        return 0;
    }
     
    int main(void){
        int n;
        int input;
        TimesOfData hash[1000000];
        int m;
        int k;
        int i;
        int j;
        int pre;
        int flag;
     
        while (scanf ("%d", &n) != EOF){
            for (i=0, j=-1; i<n; ++i){
                scanf ("%d", &input);
                if (i == 0 || input != pre){
                    ++j;
                    hash[j].data = input;
                    hash[j].times = 1;
                    pre = input;
                }
                else{
                    ++hash[j].times;
                }
            }
            scanf ("%d", &m);
            while (m-- != 0){
                scanf ("%d", &k);
                printf ("%d
    ", Bsearch (hash, 0, j, k));
            }
        }
     
        return 0;
    }

    #include <stdio.h>
     
    int Bsearch (int data[], int start, int end, int k){
        int mid;
     
        while (start <= end){
            mid = (start + end) / 2;
            if (data[mid] < k)
                start = mid + 1;
            else if (data[mid] > k)
                end = mid - 1;
            else
                return mid;
        }
        return -1;
    }
     
    int main(void){
        int n;
        int input[1000000];
        int m;
        int k;
        int i;
        int index;
        int num;
     
        while (scanf ("%d", &n) != EOF){
            for (i=0; i<n; ++i){
                scanf ("%d", &input[i]);
            }
            scanf ("%d", &m);
            while (m-- != 0){
                scanf ("%d", &k);
                index = Bsearch (input, 0, n-1, k);
                if (index == -1)
                    printf ("0
    ");
                else{
                    num = 1;
                    i = index - 1;
                    while (i >= 0 && input[i--] == k)
                        ++num;
                    i = index + 1;
                    while (i < n && input[i++] == k)
                        ++num;
                    printf ("%d
    ", num);
                }
            }
        }
     
        return 0;
    }

    本以为主要考的是哈希表才有了第一个程序,谁知却是考的二分查找,呵呵……

  • 相关阅读:
    Android网页打开指定App
    使用Android Studio Gradle实现友盟多渠道打包
    Android开发 PopupWindow弹窗调用第三方地图(百度,高德)实现导航功能
    Android使用Mob ShareSDK 分享不同平台
    Android布局优化之层级优化
    (Facebook开源项目)Fresco:一个新的Android图像处理类库
    关于Android开发的几点建议
    [AndroidTips]startService与bindService的区别
    基于HBase的手机数据备份系统 .
    MySQL在CenterOS和Ubuntu的安装
  • 原文地址:https://www.cnblogs.com/liushaobo/p/4373802.html
Copyright © 2020-2023  润新知