剑指offer--面试题53 在排序数组中查找数字(二分)
来源:互联网 发布:上海美猴网络骗局 编辑:程序博客网 时间:2024/06/16 10:59
//数字在排序数组中出现的次数#include <iostream>using namespace std;int GetFirstK(const int* data,int length,int k,int start,int end);int GetLastK(const int* data,int length,int k,int start,int end);int GetNumberOfK(int* data,int length,int k){ int number = 0; if(data!=nullptr&&length>0) { int first = GetFirstK(data,length,k,0,length-1); int last = GetLastK(data,length,k,0,length-1); if(last>-1&&first>-1) number =last - first+1; } return number;}int GetFirstK(const int* data,int length,int k,int start,int end){ if(start>end) return -1; int middleIndex = (start+end)/2; int middleData = data[middleIndex]; if(middleData==k) { if((middleIndex>0&&data[middleIndex-1]!=k)||middleIndex==0) return middleIndex; else end = middleIndex-1; } else if(middleData>k) { end = middleIndex-1; } else { start = middleIndex+1; } return GetFirstK(data,length,k,start,end);}int GetLastK(const int* data,int length,int k,int start,int end){ if(start>end) return -1; int middleIndex = (start+end)/2; int middleData = data[middleIndex]; if(middleData==k) { if((middleIndex<length-1 && data[middleIndex+1]!=k)||middleIndex ==length-1) return middleIndex; else start = middleIndex+1; } else if(middleData>k) { end = middleIndex-1; } else { start = middleIndex+1; } return GetLastK(data,length,k,start,end);}// ====================测试代码====================void Test(const char* testName, int data[], int length, int k, int expected){ if(testName != nullptr) printf("%s begins: ", testName); int result = GetNumberOfK(data, length, k); if(result == expected) printf("Passed.\n"); else printf("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", nullptr, 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--面试题53 在排序数组中查找数字(二分)
- 剑指Offer(第二版)面试题53:在排序数组中查找数字出现的次数
- 【剑指offer】面试题53(1):数字在排序数组中出现的次数
- 【剑指offer】面试题 53:数字在排序数组中出现的次数
- 剑指Offer面试题38(Java版):数字在排序数组中出现的次数
- 剑指Offer面试题38(Java版):数字在排序数组中出现的次数
- 数字在排序数组中出现的次数(剑指offer面试题56)
- 剑指Offer面试题8旋转数组的最小数字(二分查找)附带快排和按年龄排序
- [剑指offer][面试题38]数字在排序数组中出现的次数
- 剑指Offer:面试题38 数字在排序数组中出现的次数
- 剑指offer面试题38:数字在排序数组中出现的次数
- 剑指offer 面试题38—数字在排序数组中出现的次数
- 《剑指Offer》学习笔记--面试题38:数字在排序数组中出现的次数
- 【剑指Offer学习】【面试题38:数字在排序数组中出现的次数】
- 《剑指Offer》面试题:统计一个数字在排序数组中出现的次数
- 剑指offer-面试题38:数字在排序数组中出现的次数
- 剑指offer之面试题38数字在排序数组中出现的次数
- 剑指offer面试题38:数字在已排序数组中出现的次数
- idea bug调试技巧
- Linux命令基础6-mkdir命令
- nginx.conf配置
- dijkstra的算法模板
- Java学习路线-基础篇
- 剑指offer--面试题53 在排序数组中查找数字(二分)
- 反转链表
- FreeRTOS事件组之事件组的创建(xEventGroupCreate())
- nginx的upstream目前支持的5种方式的分配
- 数据库连接_留着以后copy
- nginx命令
- SQLServer2008数据库分离与附加
- MongoDB 3.4 分片与副本集实践笔记
- java问题:不要在nextByte()、nextShort()、nextInt()、nextLong()、nextFloat()、nextDouble()、next()之后使用nextLine()