剑指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
- 【剑指offer】数字在排序数组中出现的次数
- 剑指offer--数字在排序数组中出现的次数
- 《剑指offer》数字在排序数组中出现的次数
- 剑指offer:数字在排序数组中出现的次数
- 剑指offer-数字在排序数组中出现的次数
- 剑指offer:数字在排序数组中出现的次数
- [剑指offer]数字在排序数组中出现的次数
- 剑指offer 数字在排序数组中出现的次数
- [剑指offer]数字在排序数组中出现的次数
- 剑指offer|数字在排序数组中出现的次数
- 剑指offer-数字在排序数组中出现的次数
- 《剑指offer》-数字在排序数组中出现的次数
- 剑指offer - 数字在排序数组中出现的次数
- 剑指offer-数字在排序数组中出现的次数
- 【剑指offer】数字在排序数组中出现的次数
- 剑指offer:数字在排序数组中出现的次数
- 《剑指offer》数字在排序数组中出现的次数
- 剑指offer-数字在排序数组中出现的次数
- 文章检索
- POI设置单元格的宽度和高度
- Windows内核安全与驱动开发
- 百度校招测试开发工程师笔经面经(转)
- vs2010运行动态链接库找不到的问题
- 剑指offer 38-数字在排序数组中出现的次数
- MongoDB常用操作命令大全
- ASP.NET实现验证码
- eclipse打不开闪退解决方式
- call
- MyBatis学习4---使用MyBatis_Generator生成Dto、Dao、Mapping
- 如何诊断RAC系统中的'gc cr multi block request'?
- PowerDesigner15连接Oracle数据库并导出Oracle的表结构
- 我的Hadoop、Hbase、Hive、Impala总结