面试题38:数字在排序数组中出现的次数

题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。

主要的思路是进行二分搜索找到第一个位置和最后一个位置,一开始的代码如下

 #include <cstdio>
#include <cstdlib> int num[];
int n; int getFirstk(int from, int to, int k) {
if(to < from) {
return -;
} int mid = (from+to)/;
if(num[mid] < k) {
return getFirstk(mid+,to,k);
}
else if(num[mid] > k) {
return getFirstk(from,mid-,k);
}
else {
if(mid == ) {
return ;
}
if(num[mid-] == k) {
return getFirstk(from,mid-,k);
}
else if(num[mid-] != k) {
return mid;
}
}
} int getLastK(int from, int to, int k) {
if(to < from) {
return -;
} int mid = (from+to)/;
if(num[mid] < k) {
return getLastK(mid+,to,k);
}
else if(num[mid] > k) {
return getLastK(from, mid-, k);
}
else {
if(mid == n-) {
return mid;
}
else {
if(num[mid+] == k) {
return getLastK(mid+,to,k);
}
else {
return mid;
}
}
}
} int main(int argc, char const *argv[])
{ while(scanf("%d",&n) != EOF) {
for(int i = ; i < n; i++) {
scanf("%d",&num[i]);
}
int k;
scanf("%d",&k);
int from = getFirstk(,n-,k);
int to = getLastK(,n-,k);
int ans; ans = to - from+; printf("%d\n",ans);
}
return ;
}

这段代码的主要问题在于没有考虑元素没有找到的情况,倘若都没找到,from和to都为-1,则会导致结果为1

修改如下

 #include <cstdio>
#include <cstdlib> int num[];
int n; int getFirstk(int from, int to, int k) {
if(to < from) {
return -;
} int mid = (from+to)/;
if(num[mid] < k) {
return getFirstk(mid+,to,k);
}
else if(num[mid] > k) {
return getFirstk(from,mid-,k);
}
else {
if(mid == ) {
return ;
}
if(num[mid-] == k) {
return getFirstk(from,mid-,k);
}
else if(num[mid-] != k) {
return mid;
}
}
} int getLastK(int from, int to, int k) {
if(to < from) {
return -;
} int mid = (from+to)/;
if(num[mid] < k) {
return getLastK(mid+,to,k);
}
else if(num[mid] > k) {
return getLastK(from, mid-, k);
}
else {
if(mid == n-) {
return mid;
}
else {
if(num[mid+] == k) {
return getLastK(mid+,to,k);
}
else {
return mid;
}
}
}
} int main(int argc, char const *argv[])
{ while(scanf("%d",&n) != EOF) {
for(int i = ; i < n; i++) {
scanf("%d",&num[i]);
}
int k;
scanf("%d",&k);
int from = getFirstk(,n-,k);
int to = getLastK(,n-,k);
int ans;
if(from == - || to == -) {
ans = ;
}
else {
ans = to - from+;
}
printf("%d\n",ans);
}
return ;
}

找到一个在线测试的oj

http://www.nowcoder.com/books/coding-interviews/70610bf967994b22bb1c26f9ae901fa2?rp=2

此oj的编译条件很严格,而且形式与平常的oj略有不同,花了一点时间来适应,ac代码如下

 class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
int n = data.size();
if(n < ) {
return ;
}
int from = getFirstk(data,,n-,k);
int to = getLastK(data,,n-,k,n);
if(from == - || to == -) {
return ;
}
int ans = to - from+;
return ans;
} int getFirstk(const vector<int> &num,int from, int to, int k) {
if(to < from) {
return -;
} int mid = (from+to)/;
if(num[mid] < k) {
return getFirstk(num,mid+,to,k);
}
else if(num[mid] > k) {
return getFirstk(num,from,mid-,k);
}
else {
if(mid == ) {
return ;
}
if(num[mid-] == k) {
return getFirstk(num,from,mid-,k);
}
else if(num[mid-] != k) {
return mid;
}
}
return -;
} int getLastK(const vector<int> &num,int from, int to, int k, int n) {
if(to < from) {
return -;
} int mid = (from+to)/;
if(num[mid] < k) {
return getLastK(num,mid+,to,k,n);
}
else if(num[mid] > k) {
return getLastK(num,from, mid-, k,n);
}
else {
if(mid == n-) {
return mid;
}
else {
if(num[mid+] == k) {
return getLastK(num,mid+,to,k,n);
}
else {
return mid;
}
}
}
return -;
}
};

最新文章

  1. MahApps.Metro使用
  2. QImage::drawRect 和 fillRect在处理大面积区域时代价高昂
  3. CF459E Pashmak and Graph (DP?
  4. Svn版本控制工具的作用和应用
  5. 一个简单的CORBA例子
  6. 1.Java为什么能跨平台运行?请简述原理。
  7. Logspout安装、使用
  8. python学习笔记之初识Python
  9. Struts2 教程
  10. js 保留小数位数
  11. 转:CFile::Seek
  12. [Ext JS 4] 布局之实战一 - 中间区块不会自动伸展 (tab)
  13. 修改es最大返回结果数
  14. Scala 安装 Exception in thread &quot;main&quot; java.lang.VerifyError: Uninitialized object exists on backward branch 96
  15. linux iio子系统
  16. JavaScript复制文本探究
  17. 第n次搭建 SSM 框架
  18. 微软官方的.net开发人员代码示例
  19. mac mysql5.5升级5.7记录
  20. Spring boot --- Spring Oauth(三)

热门文章

  1. Android商城开发系列(五)—— 商城首页回到顶部和搜索框布局实现
  2. jquery.page.js插件在使用时重复触发“上一页”和“下一页”操作
  3. LibreOJ #107. 维护全序集
  4. Unity四元素运用之风向标跟随箭头
  5. Spring boot 集成 Dubbo 快速搭建
  6. appium---命令行启动appium
  7. QT5:第一章 初始化
  8. 在ubuntu中用命令安装iperf
  9. JQuery EasyUI学习记录(一)
  10. Nuget使用备忘