剑指offer 38-数字在排序数组中出现的次数

来源:互联网 发布:广播电台在线收听软件 编辑:程序博客网 时间:2024/06/05 14:07

利用二分查找的思想,分别找出第一次和最后一次出现的位置,然后相减得到出现次数


#include<iostream>using namespace std;// 找到数组中第一个k的下标。如果数组中不存在k,返回-1int GetFirstK(int *data, int length,int start ,int end ,int k){if(start > end)return -1;int middle = (start+end)/2;if(data[middle]==k){if((middle>0 && data[middle-1]!=k) || middle==0)return middle;elseend = middle-1;}else if(data[middle]>k)end = middle-1;elsestart = middle+1;return GetFirstK(data,length,start,end,k);}// 找到数组中最后一个k的下标。如果数组中不存在k,返回-1int GetLastK(int *data,int length,  int start ,int end ,int k){if(start > end)return -1;int middle = (start+end)/2;if(data[middle]==k){if((middle<length-1 && data[middle+1]!=k) || middle==length-1)return middle;else start = middle+1;}else if(data[middle]>k)end = middle-1;elsestart = middle+1;return GetLastK(data,length,start,end,k);}int GetNumberOfK(int *data, int length ,int k){if(data==NULL || length<=0)return 0;int first = GetFirstK(data,length,0,length-1,k);int last = GetLastK(data,length,0,length-1,k);//cout<<last;if(first>-1 && last>-1)return last - first +1;return 0;}void Test(char *testName , int *data, int length ,int k, int expected){cout<<testName<<"\t";if(GetNumberOfK(data,length,k)==expected)cout<<"Passed.\n";elsecout<<"Failed.\n";}// 查找的数字出现在数组的中间void Test1(){    int data[] = {1, 2, 3, 3, 3, 3, 4, 5};    Test("Test1", data, sizeof(data) / sizeof(int), 3, 4);}// 查找的数组出现在数组的开头void Test2(){    int data[] = {3, 3, 3, 3, 4, 5};    Test("Test2", data, sizeof(data) / sizeof(int), 3, 4);}// 查找的数组出现在数组的结尾void Test3(){    int data[] = {1, 2, 3, 3, 3, 3};    Test("Test3", data, sizeof(data) / sizeof(int), 3, 4);}// 查找的数字不存在void Test4(){    int data[] = {1, 3, 3, 3, 3, 4, 5};    Test("Test4", data, sizeof(data) / sizeof(int), 2, 0);}// 查找的数字比第一个数字还小,不存在void Test5(){    int data[] = {1, 3, 3, 3, 3, 4, 5};    Test("Test5", data, sizeof(data) / sizeof(int), 0, 0);}// 查找的数字比最后一个数字还大,不存在void Test6(){    int data[] = {1, 3, 3, 3, 3, 4, 5};    Test("Test6", data, sizeof(data) / sizeof(int), 6, 0);}// 数组中的数字从头到尾都是查找的数字void Test7(){    int data[] = {3, 3, 3, 3};    Test("Test7", data, sizeof(data) / sizeof(int), 3, 4);}// 数组中的数字从头到尾只有一个重复的数字,不是查找的数字void Test8(){    int data[] = {3, 3, 3, 3};    Test("Test8", data, sizeof(data) / sizeof(int), 4, 0);}// 数组中只有一个数字,是查找的数字void Test9(){    int data[] = {3};    Test("Test9", data, sizeof(data) / sizeof(int), 3, 1);}// 数组中只有一个数字,不是查找的数字void Test10(){    int data[] = {3};    Test("Test10", data, sizeof(data) / sizeof(int), 4, 0);}// 鲁棒性测试,数组空指针void Test11(){    Test("Test11", NULL, 0, 0, 0);}int main(int argc, char* argv[]){    Test1();    Test2();    Test3();    Test4();    Test5();    Test6();    Test7();    Test8();    Test9();    Test10();    Test11();    return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 搬重物后手臂疼怎么办 和尚鹦鹉吃了盐怎么办 刚买鹦鹉不上手怎么办 word的文件时间改了怎么办 图强gps编码丢失怎么办 武统台湾后岛民怎么办 没有你我怎么办是什么歌 ios 12软件闪退怎么办 来大姨妈想吐怎么办 3岁宝宝体重轻怎么办 硕士延期毕业考上博士怎么办 中国人移民欧洲饮食不习惯怎么办 出车祸了报警警察不管怎么办 高中的孩子不好好上学怎么办 和老公消费观念不合拍怎么办 去医院没带现金怎么办 微信读书下架了怎么办 24岁血压有点高怎么办 吃鸡鼠标弹出来怎么办 电脑分辨率调错了怎么办 猎豹sc9打不开门怎么办 苹果手机卡顿反应慢怎么办 金立手机卡顿反应慢怎么办 20天宝宝黄疸219怎么办? 智慧树选修挂科怎么办 军人被纠察抓了怎么办 我家的小孩很凶怎么办 10岁儿童老挤眼怎么办? 脚趾长鸡眼好痛怎么办 月加班超过36小时怎么办 月经老提前怎么办才好 20岁例假不规律怎么办 农村的医保门诊封顶了怎么办 保研夏令营被拒怎么办 小学生去英国游学怎么办签证 医生说我湿气重怎么办 喉咙痛有来医生感冒喉咙痛怎么办 暴马丁香叶子卷怎么办 房产权40年以后怎么办 面试回答不了考官的问题怎么办 轻伤事故对方要钱太多我怎么办