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

来源:互联网 发布:软件项目评审报告 编辑:程序博客网 时间:2024/04/24 14:34

题目地址: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\n", 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\n");            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\n", num);            }        }    }     return 0;}

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

1 0
原创粉丝点击