剑指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= ...
随机推荐
- SharePoint 2016 如何修改Library 地址
Scenario #1 如何为一个Library 修改下访问 网络路径地址 1.点击library,点开open with explorer,使用Windows资源管理器打开文档库 2.在文件夹层次结 ...
- OpenLayers 3 的 图层控制控件
openlayers3的control中没有提供默认的图层控制控件. 但是git上已经有造好的轮子,直接拿来用就可以了.地址 https://github.com/walkermatt/ol3-lay ...
- 用Python计算最长公共子序列和最长公共子串
如何用Python计算最长公共子序列和最长公共子串 1. 什么是最长公共子序列?什么是最长公共子串? 1.1. 最长公共子序列(Longest-Common-Subsequences,LCS) 最长公 ...
- python_105_类的特殊成员方法
aa.py class C(): def __init__(self): self.name='QiZhiguang' 类的特殊成员方法: # 1. __doc__ 表示类的描述信息 class Do ...
- CentOS配置主机名和主机映射
1.修改本机主机名 vi /etc/sysconfig/network 修改hostname HOSTNAME=s0 2.配置主机映射 vi /etc/hosts 修改内容如下 192.168.32. ...
- Mac OS X El Capitan系统完整性保护System Integrity Protection (SIP)
http://blog.csdn.net/yulimin/article/details/49992031 引言:前段时间经历了XCode编译器代码被注入的事件后,这次 Mac OS X El Cap ...
- IEDA的安装与破解
百度搜索IDEA 进入官网下载 https://www.jetbrains.com/idea/download/#section=windows 2.下载好双击即可 3. 完成破解
- 微信小程序传值取值的几种方法
一,列表index下的取值 实现方式是:data-index="{{index}}"挖坑及e.currentTarget.dataset.index来填坑即可 1.1生成值 < ...
- CPL学习笔记(一)
整型 计算机的内存的基本单位是位(bit),可以将其看作电子开关,可以开,表示1:也可以关表示0. 字节(byte)通常指八位的内存单元. 8bit=1byte=1B; 1KB=1024B; 1M=1 ...
- (67)windows安装zabbix监控
在windows下安装zabbix agent,方法非常简单.首先到zabbix官方下载windows版本agent,地址:http://www.zabbix.com/download.php,找到“ ...