【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 ...
随机推荐
- Axis1.4 配置数组类型复杂对象
最近 项目对接 webservice,要求SOAP 标准是1.1,然后在axis 和 spring ws 和 cxf 之间进行选择,然后axis 可以自定义服务,然后随tomcat启动发布,sprin ...
- Spark 系列(七)—— 基于 ZooKeeper 搭建 Spark 高可用集群
一.集群规划 这里搭建一个 3 节点的 Spark 集群,其中三台主机上均部署 Worker 服务.同时为了保证高可用,除了在 hadoop001 上部署主 Master 服务外,还在 hadoop0 ...
- 二、java实现多线程的方式?
一.同步?异步? 下面两幅图解释了同步异步. 二.实现多线程的方式 1.继承Thread package threaddemo; class CreateThreadDemo extends Thre ...
- 简洁实用Socket框架DotNettySocket
目录 简介 产生背景 使用方式 TcpSocket WebSocket UdpSocket 结尾 简介 DotNettySocket是一个.NET跨平台Socket框架(支持.NET4.5+及.NET ...
- GitHub项目:jkrasnay/sqlbuilder的使用
http://www.jianshu.com/p/7f099b8cf5f0 技术选型: 在报表查询时,通常需要做可以动态添加的条件 在老项目中使用的是一种Tcondition的对象分装sql impo ...
- go 学习笔记之有意思的变量和不安分的常量
首先希望学习 Go 语言的爱好者至少拥有其他语言的编程经验,如果是完全零基础的小白用户,本教程可能并不适合阅读或尝试阅读看看,系列笔记的目标是站在其他语言的角度学习新的语言,理解 Go 语言,进而写出 ...
- Opengl_入门学习分享和记录_番外篇01(MacOS上如何在Xcode 开始编辑OpenGL)
写在前面的废话: 哈哈 ,我可真是勤勉呢,今天又来更新了,这篇文章需要大家接着昨天的番外篇00一起食用! 正文开始: 话不多说,先看代码. 这里主要全是使用的glfwwindowhint 这个函数,他 ...
- 洛谷 P4344 [SHOI2015]脑洞治疗仪
题意简述 维护序列,支持以下操作: 0 l r:将l~r赋为0 1 l1 r1 l2 r2:将l1~r1中的1替换l2~r2中的0,多余舍弃 2 l r:询问l~r中最大连续1的长度 题解思路 珂朵莉 ...
- 『深度应用』一小时教你上手MaskRCNN·Keras开源实战(Windows&Linux)
0. 前言介绍 开源地址:https://github.com/matterport/Mask_RCNN 个人主页:http://www.yansongsong.cn/ MaskRCNN是何凯明基于以 ...
- BFS-迷宫问题
问题描述 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, ...