剑指offer 面试题38
面试题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 -;
}
};
剑指offer 面试题38的更多相关文章
- 剑指offer 面试题38 字符串的排列
我惯用的dfs模板直接拿来套 class Solution { public: vector<string> Permutation(string str) { if(str.empty( ...
- 【剑指offer 面试题38】数字在排序数组中出现的次数
思路: 利用二分查找,分别查找待统计数字的头和尾的下标,最后做差加一即为结果. C++: #include <iostream> #include <vector> using ...
- C++版 - 剑指offer面试题38:数字在已排序数组中出现的次数
数字在已排序数组中出现的次数 提交网址: http://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2?tpId=13&t ...
- 剑指Offer:面试题15——链表中倒数第k个结点(java实现)
问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...
- 剑指offer面试题3 二维数组中的查找(c)
剑指offer面试题三:
- 剑指Offer——笔试题+知识点总结
剑指Offer--笔试题+知识点总结 情景回顾 时间:2016.9.23 12:00-14:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...
- C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告
剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...
- C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解
剑指offer 面试题23:从上往下打印二叉树 参与人数:4853 时间限制:1秒 空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...
- C++版 - 剑指offer 面试题39:判断平衡二叉树(LeetCode 110. Balanced Binary Tree) 题解
剑指offer 面试题39:判断平衡二叉树 提交网址: http://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId= ...
随机推荐
- C# 使用解析json 嵌套方法
C#从网页不传参数 接收json数据 public String GetHtmlFromUrl(String url) { //Response.Write(url); //Response.End( ...
- javaSe-String/StringBuffer
//String字符串.在进行字符串拼接的时候总是改变栈中指向堆中的位置 //StringBuffer字符串.在进行字符串拼接的时候不改变栈中指向堆中的位置 package com.java.chap ...
- 突然心血来潮,想写写我在java面试中遇到的事。作为一个应届生,我觉得我的情况都与大部分应届生是差不多的,希望你们能在这上面得到一些有用的
面试过程吧,怎么说呢?从一开始接触面试到现在成功了几家,这中间我确实收获了许多,那我就从我第一次面试开始讲吧. 第一次面试是有人介绍过来的,总之还是有一位贵人相助,所以第一次面试时,面试官很好没有怎么 ...
- 使用JDK自带的VisualVM进行Java程序的性能分析
VisualVM是什么? VisualVM是JDK自带的一个用于Java程序性能分析的工具,JDK安装完毕后就有啦,在JDK安装目录的bin文件夹下能找到名称为jvisualvm.exe. 要使用Vi ...
- rhythmbox插件开发笔记3:安装 makefile && schema && po
本篇主要讲通过makefile方式来安装rhythmbox插件的相关知识. makefile 如果makefile是什么,请自行谷歌 参考了pandasunny同学的rhythmbox-baidu-m ...
- 在一个另一个文件中 #include一个**dlg.h文件,会发生dlg的资源ID未定义的错误 :
1 在一个另一个文件中 #include一个**dlg.h文件,会发生dlg的资源ID未定义的错误 : dlg1.h(23) : error C2065: 'IDD_DIALOG1' : und ...
- alibaba druid监控页面的使用配置
一.Maven中添加Durid连接池依赖 <!-- druid连接池 --> <dependency> <groupId>com.alibaba</group ...
- Angular-constructor和ngOnInit区别
参考文档:https://blog.csdn.net/u010730126/article/details/64486997 总结:constructor做依赖注入,避免业务操作: ngOninit做 ...
- Caesars Cipher-freecodecamp算法题目
Caesars Cipher(凯撒密码.移位密码) 要求 字母会按照指定的数量来做移位. 一个常见的案例就是ROT13密码,字母会移位13个位置.由'A' ↔ 'N', 'B' ↔ 'O',以此类推. ...
- 控制nginx并发链接数量和客户端请求nginx的速率
一.控制nginx并发链接数 ngx_http_limit_conn_module这个模块用于限制每个定义的key值的链接数,特别是单IP的链接数. 不是所有的链接数都会被计数,一个符合计数要求的连接 ...