剑指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= ...
随机推荐
- CAS 配置NLB 负载均衡网络无法连接
在虚拟机与虚拟机.虚拟机与实机之间利用Windows操作系统自带的网络负载均衡功能如选择单播集群模式,网络就无法通讯,NLB不成功. Scenario #1 在虚拟机与虚拟机之间选择多播模式NLB可正 ...
- js操作文档对象的节点
好吧,为了能让大家不至于睡着,我们先回顾先前面的东东吧~ 1.首先我们写了javaScriput的是一门弱类型的解释性的脚本语言:弱类型:我们的变量不用申明其具体的数据类型,在使用的时候浏览器根据其存 ...
- Context 使用不当造成内存泄露
问题: Activity中的context被传递给了一个生命周期长过activity的对象(通常为静态单实例变量),导致activity不能正常被销毁. 示例:Activity 调用 ChatMgr ...
- guruguru
6576: guruguru 时间限制: 1 Sec 内存限制: 128 MB提交: 28 解决: 12[提交] [状态] [讨论版] [命题人:admin] 题目描述 Snuke is buyi ...
- PSNR
PSNR,峰值信噪比,通常用来评价一幅图像压缩后和原图像相比质量的好坏,当然,压缩后图像一定会比原图像质量差的,所以就用这样一个评价指标来规定标准了.PSNR越高,压缩后失真越小.这里主要定义了两个值 ...
- Mac下快捷键的符号所对应的按键
- 经常用到的js函数
//获取样式 function getStyle(obj,attr){ if(obj.currentStyle){ return obj.currentStyle[attr]; }else{ retu ...
- 忘记root密码怎么办-单用户模式修改root密码
忘记root密码怎么办-单用户模式修改root密码================================= 1,开机3秒内按下向下的方向键,目的是为了不让它进入系统,而是停留在开机界面. 2 ...
- angular5 HttpInterceptor使用
HttpInterceptor接口是ng的http请求拦截器,当需要拦截http请求,可以实现该接口. 1.创建HttpInterceptor 的实现类,并使用@Injectable()注解 @Inj ...
- 8.Yii2.0框架控制器接收get.post数据
8.Yii2.0框架控制器接收get.post数据 一.get传参 <?php /** * Created by Haima. * Author:Haima * QQ:228654416 * D ...