53_剑指offer_java_题目一_排序数组中数字出现次数

《剑指offer》Java版 一、引言 《剑指offer》可谓是程序猿面试的神书了,在面试中帮了我很多,大部分面试的算法题都会遇到原题或者是类似的题。但是书上的代码都是C版的,我在这里整理了一份Java版的代码供大家学习参考,这些代码我都是在OJ上跑过全AC的,所以正确性你大可放心。 二、目录 1赋值运算函数 2单例设计模式 3二维数组中查找目标值 4替换字符串中的空格 5从尾到头打印链表 6由前序和中序遍历重建二叉树 7用两... 阅读详情

目录

 

题目描述

测试用例

题目考点

解题思路

参考解题

排错记录


题目描述

数字在排序数组中出现的次数。

统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。

 

测试用例

  • 功能测试(数组中包含要查找的数字;数组中没有要查找的数字;要查找的数字在数组中出现一次/多次)
  • 边界值测试(查找数组中的最大值、最小值;数组中只有一个数字)
  • 特殊输入测试(表示数组的指针为空指针)

 

题目考点

  • 考察应聘者的只是迁移能力。
  • 考察应聘者对二分查找算法的理解程度。

 

解题思路

一看到在排序(排序数组,一样的数字是挨到一起的)数组中查找,大家一定能想到二分查找法,但是怎么用可以减少复杂度.

 

  1. 利用二分查找法找出最早(左)出现的k的下标:

如果中位数为k,看中位数前一个是否为k。是的话,说明要继续在数组前半段寻找第一个k(递归);不是的话,说明当前中位数为第一个k,返回当前下标;

     2.利用二分查找法找出最晚(右)出现的k的下标

同理,如果中位数为k,看中位数后一个是否为k。是的话,说明要继续在数组后半段寻找最后一个k(递归);不是的话,说明当前中位数为第一个k,返回当前下标;

 

参考解题

public class Solution {
    // 排序数组中数字出现次数
    // 排序数组,查找,二分查找,确定第一个和最后一个k的位置
    public int GetNumberOfK(int [] array , int k) {
       // 异常
        if(array == null || array.length == 0){
            return 0;
        }
        
        int number =  0;
        int first = GetFirstKIndex(array, k, 0, array.length - 1);
        int last = GetLastKIndex(array, k, 0, array.length - 1);
        
        if(first != -1 && last != -1){
            number = last - first + 1;
        }
        
        return number;
    }
    
    
    // 二分查找改变,找到中位数之后再进行一次比较
    // ------第一个k下标----------------
    public int GetFirstKIndex(int[] array, int k, int start, int end){
        // 异常
            if(start > end || start < 0 || end > array.length - 1){
                return -1;
            }
        
           int midIndex = (start + end)>>1;
           int midData = array[midIndex];
           if(midData == k ){
               if( (midIndex > 0 && array[midIndex - 1] != k )
                  || midIndex == 0){
                   // 中位数为k,中位数前一位不是k,所以中位数为第一个k
                   return midIndex;
               }else{
                   end = midIndex - 1;
               }
           }else if(midData > k){
               end =  midIndex - 1;
           }else{
               start =  midIndex + 1;
           }
           
           return GetFirstKIndex(array, k, start, end);
    }
    
    // ------最后一个k下标--------------------------------
    public int GetLastKIndex(int[] array, int k, int start, int end){
        // 异常
            if(start > end || start < 0 || end > array.length-1){
                return -1;
            }
           int midIndex = (start + end) >> 1;
           int midData = array[midIndex];
           if(midData == k ){
               if((midIndex < array.length - 1 && array[midIndex + 1] != k  ) 
                  || midIndex == array.length - 1){
                   // 中位数为k,中位数后一位不是k,所以中位数为最后一个k
                   return midIndex;
               }else{
                   start = midIndex + 1;
               }
           }else if(array[midIndex] > k){
               end =  midIndex - 1;
           }else{
               start =  midIndex + 1;
           }
           
           return GetLastKIndex(array, k, start, end);
           
    }
}

 

排错记录

if( (midIndex > 0 && array[midIndex - 1] != k )
                  || midIndex == 0)

在书写这一句条件的时候,前后顺序不一样会导致索引溢出错误。先判断midIndex > 0成立之后,再有表达式array[midIndex - 1] 的正确性。 

牛客网剑指Offer - java版 剑指Offer - java版 文章目录剑指Offer - java版JZ01JZ02 替换空格JZ03 从尾到头打印链表JZ04 重建二叉树JZ05 用两个栈实现队列JZ06 旋转数组的最小数字JZ07 斐波那契数列JZ08 跳台阶问题JZ09 青蛙跳台阶JZ10 矩形覆盖JZ11 二进制中1的个数JZ12 数值的整数次方JZ13 调整数组顺序,使奇数位于偶数前面JZ14 链表中倒数第k个结点JZ15 反转链表JZ16 合并两个排序的链表JZ17 树的子结构JZ18 二叉树的镜像JZ19 顺时针打印矩阵J 阅读详情

相关推荐

Delta-Sigma调制(DSM)技术

前言 数字信号处理和通信系统的性能很大程度上受到了模拟信号到数字信号转换接口——ADC的精度和分辨率的限制。而传统的线性脉冲编码调制(PCM)ADC受到了制造工艺的限制,无法达到很高的分辨率。但基于Delta-Sigma调制技术的ADC可以在现有工艺下实现高分辨率(大于16位),同时由于结构简单,所以易于实现。低成本高性能使得Delta-Sigma调制技术得到了广泛的应用。 Delta-Sigma型ADC的结构原理图如下图所示: 它最大的优势在于仅用1位ADC进行数据转换,同时其模拟电路部分结构简单不需要

阿星的博客 2万+

由数字0和1组成的字符串,最多将0变化k次产生的全1子串的最大长度

题目描述:给定一个由字符0和1组成的字符串;给定一个整数k,表示最多可以将原字符串中0变成1的次数; 问题:求改变后的字符串中,全1子串的最大长度。 c++代码如下: #include <iostream> #include <string> #include <vector> #include <algorithm> using ...

weixin_30814223的博客 1984

SAP 销售订单及发票 利润中心替代 Userexit出口 配置及程序

在跨公司销售业务中,跨公司销售订单的发票时无法从销售订单中将利润中心带到发票中,所以在跨公司的发票创建过程中需要配置出口来获取对应销售订单行项目的利润中心。 事务代码: 0KEM 配置步骤: 1、创建一个新的替代 2、创建一个步骤 3、维护一个先决条件,比如针对于特定工厂 PCASUB-VKBUR = '0001' 4、选择替代程序FORM,FORM必须为指定程序中存在的FORM名 5、编辑替代程序FORM 实现效果: 在程序FORM中打上断点 ...

李威威wiwi的博客 5069

数字在排序数组中出现的次数

题目:统计一个数字在排序数组中出现的次数,例如输入排序数组{1,2,3,3,3,3,4,5},由于3在这个数组中出现了4次,因此输出4。思路:既然数组是排序的,那我们自然就能想到用二分查找算法。在题目给出的例子中,我们可以先用二分查找算法找到一个3.由于3出现了很多次,因此我们找到的3的左右两边都有3,于是我们在找到3的左右两边顺序扫描,分别找到第一个3和最后一个3。因为我们要查找的数字在长度为n

luoshasha1216的博客 355

【Python脚本】Python自动大麦网抢票,准点原价秒杀演唱会门票,拒绝黄牛交易!从我做起!!!1

你是否错过了周杰伦的票,最近又没抢到五月天的票,不要太难过,今晚有张学友的票,后天还有张杰的票,加油哦!

weixin_45841831的博客 6万+

大数据之父_BIM先驱Charles (Chuck) M. Eastman逝世——致敬“BIM之父”

原标题:BIM先驱Charles (Chuck) M. Eastman逝世——致敬“BIM之父”BIM研究的先驱、佐治亚理工教授Charles (Chuck) M. Eastman于本周一(11月9日)在其Atlanta家中逝世。特转韩国Yonsei大学Ghang Lee教授的讣文以作纪念。过世原因未说明。BIM的出现是与当今时代科技的发展分不开的。在信息时代建筑发展面临的挑战巨大:建筑物越建越高...

weixin_39941262的博客 3302

在排好序的数组中找出给定数字出现的次数

#include int BinarySearch(int *a,int length,int num,bool isLeft) { int left=0,right=length-1; int last=0; while(left<=right) { int mid=(left+right)/2; if(a[mid]<num) { left=mid+1; }

但行好事,莫问前程 1592

实现高精度卷积混响--MATLAB仿真篇

一、前言 之前在STM32F407上现实了直播声卡,实现的经典Schroeder混响模型和Moorer混响模型,得到不错效果。后来得知卷积混响最为真实地表现空间的特性,所以也就尝试在MCU上实现一个高精度的卷积混响(卷积点数为32768),目前MCU出来的混响效果算得上一流水准,本人也在计划在ADI的21489或者SC584上更高精度的卷积混响。 二、卷积方式 1、conv1是使用MATLAB自带卷积函数conv 2、conv2和conv3是改进后卷积过程,具有减少运算量特点,方便嵌入式移植 clear;

Six44的博客 5078

机器学习面试总结

作者:xfcherish 链接:https://www.nowcoder.com/discuss/65323?type=0&order=0&pos=50&page=1 来源:牛客网 https://www.zhihu.com/question/59683332/answer/281642849知乎回答的补充部分 * 在知乎上发过,但是被人指出贴题目是非常不好的行为...

weixin_30268071的博客 759

在windows安装程序时出现 系统无法打开指定的设备或文件的解决方案

本文主要介绍了在windows安装程序时出现 系统无法打开指定的设备或文件的解决方案,希望能对使用windows的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

用业务语义织就企业数据之网:SAP Datasphere 的定位、架构与落地场景全解析

SAP Datasphere作为SAP业务数据云的核心组件,通过语义层整合企业内外部数据,支持实时分析与AI应用。其核心功能包括数据集成、语义建模、虚拟化与仓库能力,通过Spaces实现资源隔离,Data Builder和Business Builder分别面向技术和业务建模。该平台与SAP HANA Cloud、SAC等深度集成,支持财务统一分析、供应链可视化等典型场景,并可通过BW bridge实现传统BW资产云化迁移。Datasphere强调开放互联,能与Databricks等生态伙伴协同,为企业提供

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1362

LeetCode【1004】最大连续1的个数 III

题目 给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。 返回仅包含 1 的最长(连续)子数组的长度。 示例 1: 输入:A = [1,1,1,0,0,0,1,1,1,1,0], K = 2 输出:6 解释: [1,1,1,0,0,1,1,1,1,1,1] 粗体数字从 0 翻转到 1,最长的子数组长度为 6。 示例 2: 输入:A = [0,0,1,1,0...

qq422243639的博客 2098

微信小程序 - 实现客户支付订单连接小票打印机自动打印订单小票功能,微信小程序如何对接小票打印机自动打印小票,小程序收到新订单的时候可以联动商家打印出小票/单据/标签/发货单/电子面单等(详细教程)

微信小程序调用小票打印机,小程序接单后小票机自动打印订单,微信小程序云开发订单微信支付与小票和标签打印的完整高效流程,如何实现微信订单连接小票打印机并自动接单打印,微信小程序连接打印机打印单据小票打印,微信小程序云开发调用小票打印机实现方案,微信小程序怎么配置小票打印机,微信支付电子小票,外卖小程序实战-接单后小票机自动打印订单,微信小程序连接蓝牙打印小票,打印购物小票,调用小票打印机打印小票,微信订单如何连接小票打印机并实现自动接单打印,实现微信订单连接小票打印机并自动接单打印,微信小程序小票打印机打印教

🏆 前端领域优质创作者 1万+

[剑指offer] JAVA版题解(完整版)

本文首发于我的个人博客:尾尾部落 序号 题解 牛客 OJ 数据结构类型 03 [剑指offer] 二维数组中的查找 二维数组中的查找 数组 04 [剑指offer] 替换空格 替换空格 字符串 05 [剑指offer] 从尾到头打印链表 从尾到头打印链表 链表 06 [剑指offer] 重建二...

尾尾部落 6万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

《剑指offer》66道算法题合集(java实现)

1

weixin_43774841的博客 2万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

剑指 Offer 53 - I. 在排序数组中查找数字 I 【 c++/java详细题解 】

目录1、题目2、思路3、c++代码4、java代码 1、题目 统计一个数字在排序数组中出现的次数。 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 示例 2: 输入: nums = [5,7,7,8,8,10], target = 6 输出: 0 提示: 0 <= nums.length <= 10^5 -10^9 <= nums[i] <= 10^9 nums 是一个非递减数组 -10^9 <= target <

林深不见鹿 的博客 2191

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

剑指offer | 面试题53 - I.数字在排序数组中出现的次数

转载本文章请标明作者和出处 本文出自《Darwin的程序空间》 本文题目和部分解题思路来源自《剑指offer》第二版 开始行动,你已经成功一半了,献给正在奋斗的我们 题目 统计一个数字在排序数组中出现的次数 示例: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 解题分析 首先我们分析一下题干,一个排序的数组,我们应该下意识的相到,排序的数组,百分之9...

程序员大航子 8059

剑指offer面试题53(java版):数字在排序数组中出现的次数

welcome to my blog 剑指offer面试题53(java版):数字在排序数组中出现的次数 题目描述 统计一个数字在排序数组中出现的次数 思路 找到第一个k的索引和最后一个k的索引就知道有序数组中k出现的次数了 笔记 二分法中,最好先判断arr[mid]>k, 接着arr[mid]<k, 剩下的便是arr[mid]==k, arr[mid]==k这个条件就不用显式地...

littlehaes的博客 647

[剑指Offer]-在排序数组中查找数字

题目描述(一) 统计一个数字在排序数组中出现的次数。{1,2,3,3,3,3,4,5} 3出现了4次。 解题思路 当然可以无脑用哈希表或者直接遍历,空间复杂度O(n),时间复杂度O(1)代码略 优化:在找第一个k时,首先也是二分找到中间的k,然后和它上一个数字相比,如果还是k,则在前半段数组继续二分,直到找到中间的数为k且前一个不等于k。 用同样的方法,找最后一个k 时间复杂度为O(logn) ...

LeoByte的编程驿站 2311

【刷题】2021最新剑指Offer汇总

新手村 关卡1-1 洛谷的第一个任务 超级玛丽游戏(洛谷-P1000):点击这里 A+B Problem(洛谷-P1001):点击这里

瑞新の博客:bennyrhys 6299

剑指 Offer 53 - I. 在排序数组中查找数字 I

剑指 Offer 53 - I. 在排序数组中查找数字 I、 剑指 Offer 53 - I. 在排序数组中查找数字 I 统计一个数字在排序数组中出现的次数。 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 示例 2: 输入: nums = [5,7,7,8,8,10], target = 6 输出: 0 思路:hashmap统计数加判断 package 期末; import java.util.HashMap; import java.util.Map

无雨 133

剑指Offer(java答案)

剑指Offer(java答案)剑指Offerjava答案 5从尾到头打印链表 6重建二叉树 33把数组排成最小的数 34丑数 35第一个只出现一次的字符 36数组中的逆序对 37两个链表的第一个公共交点 38数字在排序数组中出现的次数 39二叉树的深度 扩展题判断二叉树平衡 40-数组只指出现一次的数字 异或去重 11-1000放在含有1001个元素的数组中只有唯一的一个元素值重复其它均只出现一次每

壮少Bryant的博客 2万+

剑指offer题目代码总结

剑指 Offer 26. 树的子结构 二叉树匹配类问题总结 B 属于 A 的一部分也可以,没必要一直匹配到叶子节点 递归解法 recur的返回条件: 当节点 B 为空:说明树 B 已匹配完成(越过叶子节点),因此返回 true ; 当节点 A 为空:说明已经越过树 A 叶子节点,即匹配失败,返回 false; 剑指 Offer 28. 对称的二叉树 1.递归解法 2.非递归解法(队列) 剑指 Offer 27. 二叉树的镜像 1.递归解法 2.非递归解法(栈或队列) ​​ ...

weixin_42072280的博客 2047

剑指offer—53.数字在排序数组中出现的次数—分析及代码(Java)

剑指offer——53.数字在排序数组中出现的次数——分析及代码[Java]一、题目二、分析及代码1. 二分查找(1)思路(2)代码(3)结果三、其他 一、题目 统计一个数字在排序数组中出现的次数。 二、分析及代码 1. 二分查找 (1)思路 因为题目给出的是排序数组,可以结合二分查找的思路,分别找到数组中对应数字的第一个和最后一个位置,计算得出次数。 (2)代码 public class Solution { public int GetNumberOfK(int [] array , int k

江南土豆的博客 191

[算法练习及思路-leetcode剑指offer(Java解法)]No53.在排序数组中查找数字 I

题号:剑指 Offer 53 - I 题目名:在排序数组中查找数字 I 原题URL:https://leetcode-cn.com/problems/zai-pai-xu-shu-zu-zhong-cha-zhao-shu-zi-lcof/ 题目描述 统计一个数字在排序数组中出现的次数。 示例 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 示例 2: 输入: nums = [5,7,7,8,8,10], target = 6 输出: 0 限制

叶落雨飘的博客 164

《剑指Offer》53. 数字在排序数组中出现的次数

题目链接 牛客网 题目描述 统计一个数字在排序数组中出现的次数。 Input: nums = 1, 2, 3, 3, 3, 3, 4, 6 K = 3 Output: 4 解题思路

Melo 193
上一篇: 52_剑指offer_java_两个链表的第一个公共节点
下一篇: java_线程状态_终止
Longtermevolution
博客等级 码龄9年 113粉丝 249原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值