【Offer】[53-1] 【数字在排序数组中出现的次数】
题目描述
统计一个数字在排序数组中出现的次数。例如,输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。
思路分析
利用二分查找法查找到第一个k和最后一个k出现的位置,就可以统计出k出现的次数,比较k与中间值mid的大小:
- 如果k小于mid,则第一个k出现在前半部分,
- 如果k大于mid,则第一个k出现在后半部分,
- 如果相等,这是判断中间值是否是第一个k,如果中间值前面的值还是k,则第一个k出现在前半部分。
测试用例
- 功能测试:数组中包含要查找的数字;数组中没有要查找的数字;要查找的数字在数组中出现一次/多次。
- 边界值测试:查找数组中的最大值、最小值;数组中只有一个数字。
- 特殊输入测试:表示数组的指针为nullptr指针。
Java代码
public class Offer053_01 {
public static void main(String[] args) {
test1();
test2();
test3();
}
public static int GetNumberOfK(int[] array, int k) {
return Solution1(array, k);
}
private static int Solution1(int[] array, int k) {
if (array == null || array.length <= 0) {
return 0;
}
int firstK = getFirstK(array, 0, array.length - 1, k);
if (firstK == -1) {
return 0;
}
int lastK = getLastK(array, 0, array.length - 1, k);
return lastK - firstK + 1;
}
private static int getFirstK(int[] array,int start,int end,int k) {
if(start>end) {
return -1;
}
int mid = (start+end)>>1;
if(array[mid]==k) {
if(mid==0 || array[mid-1]!=k) {
return mid;
}else {
end = mid-1;
}
}else if(array[mid]<k) {
start = mid+1;
}else {
end = mid-1;
}
return getFirstK(array, start, end, k);
}
private static int getLastK(int[] array,int start,int end,int k) {
if(start>end) {
return -1;
}
int mid = (start+end)>>1;
if(array[mid]==k) {
if(mid==array.length-1 || array[mid+1]!=k) {
return mid;
}else {
start = mid+1;
}
}else if(array[mid]<k) {
start = mid+1;
}else {
end = mid-1;
}
return getLastK(array, start, end, k);
}
private static void test1() {
}
private static void test2() {
}
private static void test3() {
}
}
代码链接
【Offer】[53-1] 【数字在排序数组中出现的次数】的更多相关文章
- 剑指 offer set 16 数字在排序数组中出现的次数
总结 1. Leetcode 上有一道题, 求某一个数字在有序数组中出现的最左位置和最右位置, 而这道题就是那题的变形
- 【Java】 剑指offer(53-1) 数字在排序数组中出现的次数
正文 本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 统计一个数字在排序数组中出现的次数.例如输入排序数组{1, ...
- 《剑指offer》第五十三题(数字在排序数组中出现的次数)
// 面试题53(一):数字在排序数组中出现的次数 // 题目:统计一个数字在排序数组中出现的次数.例如输入排序数组{1, 2, 3, 3, // 3, 3, 4, 5}和数字3,由于3在这个数组中出 ...
- 剑指Offer - 九度1349 - 数字在排序数组中出现的次数
剑指Offer - 九度1349 - 数字在排序数组中出现的次数2013-11-23 00:47 题目描述: 统计一个数字在排序数组中出现的次数. 输入: 每个测试案例包括两行: 第一行有1个整数n, ...
- 剑指Offer(三十七):数字在排序数组中出现的次数
剑指Offer(三十七):数字在排序数组中出现的次数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.n ...
- Go语言实现:【剑指offer】数字在排序数组中出现的次数
该题目来源于牛客网<剑指offer>专题. 统计一个数字在排序数组中出现的次数. 看到排序数组,要想到用二分查找. 先找到最前面的数字k,再找到最后面的数字k,通过下标求出次数. Go语言 ...
- 【剑指Offer面试编程题】题目1349:数字在排序数组中出现的次数--九度OJ
题目描述: 统计一个数字在排序数组中出现的次数. 输入: 每个测试案例包括两行: 第一行有1个整数n,表示数组的大小.1<=n <= 10^6. 第二行有n个整数,表示数组元素,每个元素均 ...
- 数字在排序数组中出现的次数 牛客网 剑指Offer
数字在排序数组中出现的次数 牛客网 剑指Offer 题目描述 统计一个数字在排序数组中出现的次数. class Solution: def GetNumberOfK(self, data, k): i ...
- 【剑指Offer】数字在排序数组中出现的次数 解题报告(Python)
[剑指Offer]数字在排序数组中出现的次数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interv ...
随机推荐
- 数据结构之堆栈C++版
/* 堆栈本身就是一种线性数据结构,说白了他与容器线性表是一种数据类型,不要认为他多高大上. 实时上他还没有线性表复杂,下面简单的实现一下堆栈. 事实上整个核心操作都是在操作指向堆栈的顶部元素的指针 ...
- python3学习-Queue模块
python标准库中带有一个Queue模块,顾名思义,队列.该模块也衍生出一些基本队列不具有的功能. 我们先看一下队列的方法: put 存数据 get 取数据 empty 判断队列是否为空 qsize ...
- JavaWeb——使用会话维持状态
1.会话的作用 使用会话是为了维持状态,维持的是请求域请求之间的状态.因为HTTP请求自身是完全无状态的.从服务器的角度来看,当用户发出第一个请求开始,服务器无法将新的请求与之前的请求关联起来,举例说 ...
- 单机版ZooKeeper的安装教程
之前一直没有时间去整理,现在抽出几分钟时间整理以下,有问题的在评论区留言即可. 前期准备JDK环境(ZK需要jdk进行编译,本文以jdk1.8.0_211为例).Linux系统(本文以Centos7为 ...
- 时间格式的字符串在ios中的转换问题
在移动端使用时间选择器的时候,选择了一个时间转换为时间戳,谷歌浏览器以及安卓手机使用 new Date( 选择的时间 ).getTime() 都能够拿到时间戳, 但是在ios手机上会出现出现NAN ...
- 工作中常见的五种技术leader
力不从心型 在工作中有种技术leader,总认为自己是最好的.在方案设计的时候,自己有一种方案,下属有一种方案.leader非要别人听他的.如果两种方案没有优劣之分,比较建议的做法是让真正实施的人按照 ...
- H5中的history方法Api介绍
最近公司在做一个微信公众号,看了项目源码,看到项目中用到了history的Api来进行控制浏览器的历史记录及前进/后退键: 下面来跟大家一起来捋捋history的Api方法和使用: history.p ...
- 《机器学习技法》---核型SVM
(本文内容和图片来自林轩田老师<机器学习技法>) 1. 核技巧引入 如果要用SVM来做非线性的分类,我们采用的方法是将原来的特征空间映射到另一个更高维的空间,在这个更高维的空间做线性的SV ...
- Flink 源码解析 —— Standalone Session Cluster 启动流程深度分析之 Task Manager 启动
Task Manager 启动 https://t.zsxq.com/qjEUFau 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Ma ...
- 小白学Python(2)——常用Python编程工具,Python IDE
下载好Python,但是如何开始编程呢? 有几种方法, 1.第一个就是command lind 即为命令行的方式,也就是我们常说的cmd. 输入 win+ cmd 在命令行中再输入 python,即可 ...