数字在排序数组中出现的次数:
最简单粗暴的方法是O(n^2)

可能的解法可以采用二分,首先根据二分找到给定数字在数组中的位置,然后再左右二分,找到边界(第一个和最后一个),左右边界的差值就是出现次数

public class _Q38<T> {public int GetNumberOfK(int nums[], int k){if(nums == null) return 0;int first = GetFirstK(nums, k, 0, nums.length - 1);int last = GetLastK(nums, k, 0, nums.length - 1);int result = 0;if(first > -1 && last > -1){result = last - first + 1;}return result;}private int GetFirstK(int nums[], int k, int start, int end){if(nums == null || start > end) return -1;int mid = (start + end) / 2;if(nums[mid] == k){if(mid == 0) return mid;if(mid > 0 && nums[mid - 1] != k) return mid;return GetFirstK(nums, k, start, mid - 1); // 容易遗漏的逻辑分支}else if(nums[mid] > k){return GetFirstK(nums, k, start, mid - 1);}else if(nums[mid] < k){return GetFirstK(nums, k, mid + 1, end);}return -1;}private int GetLastK(int nums[], int k, int start, int end) {if (nums == null || start > end) return -1;int mid = (start + end) / 2;if (nums[mid] == k) {if (mid == end) return mid;if (mid < end && nums[mid + 1] != k) return mid;return GetLastK(nums, k, mid + 1, end); // 容易遗漏的逻辑分支} else if (nums[mid] > k) {return GetLastK(nums, k, start, mid - 1);} else if (nums[mid] < k) {return GetLastK(nums, k, mid + 1, end);}return -1;}}

测试代码:

public class _Q38Test extends TestCase {_Q38 numOfK = new _Q38();public void test(){int nums1[] = {1, 2, 3, 3, 3, 3, 4, 5};int k1 = 3;int k2 = 6;int k3 = 4;int result = 0; result = numOfK.GetNumberOfK(nums1, k1);System.out.println(result);result = numOfK.GetNumberOfK(nums1, k2);System.out.println(result);result = numOfK.GetNumberOfK(nums1, k3);System.out.println(result);result = numOfK.GetNumberOfK(null, k3);System.out.println(result);}}

【剑指offer-Java版】38数字在排序数组中出现的次数相关推荐

  1. 剑指Offer - 面试题53 - I. 在排序数组中查找数字 I(二分查找的变形版本)

    1. 题目 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2示例 2: 输入: nums = [5,7,7,8, ...

  2. 剑指offer面试题53 - I. 在排序数组中查找数字 I(二分查找)

    题目描述 统计一个数字在排序数组中出现的次数. 思路 详见链接 代码 class Solution:def search(self,nums:[int],target:int)->int:i, ...

  3. [剑指offer][JAVA]面试题第[03]题[数组中的重复数字][HashSet]

    [问题描述][数组中的重复数字][简单] 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道 ...

  4. [剑指offer][JAVA]面试题第[39]题[数组中出现次数超过一半的数字][HashMap][摩尔投票法]

    [问题描述][简单] 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.你可以假设数组是非空的,并且给定的数组总是存在多数元素.示例 1:输入: [1, 2, 3, 2, 2, 2, 5, ...

  5. 剑指Offer(Java版):数字在排序数组中出现的次数

    2019独角兽企业重金招聘Python工程师标准>>> 题目:统计一个数字在排序数组中出现的次数.例如输入排序数组为 {1,2,3,3,,3,3,4,5}和数字3,由于3在这个数组中 ...

  6. 剑指offer——面试题38:数字在排序数组中出现的次数

    剑指offer--面试题38:数字在排序数组中出现的次数 20180906整理 Solution1: [注意]先利用二分查找扎到一个值然后再顺序遍历的做法时间复杂度也是O(n)O(n)O(n),代码也 ...

  7. 剑指offer java版 test3—从尾到头打印链表

    标题:剑指offer java版 test3-从尾到头打印链表 题目:输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 解答:知识不够全面,用ArrayList做的 但是看到大佬们还可以 ...

  8. 【剑指offer】数字在排序数组中出现的次数

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/27364557 题目描写叙述: 统计一个数字在排序数组中出现的次数. 输入: 每一个測试案例 ...

  9. 《剑指offer》-- 调整数组顺序使奇数位于偶数前面、顺时针打印矩阵、数字在排序数组中出现的次数

    一.调整数组顺序使奇数位于偶数前面: 1.题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之 ...

最新文章

  1. 你会么?图形不正,角度是随机的
  2. 6421B Lab10 网络文件和打印服务的配置与故障排除
  3. React Native与React的关系及特点
  4. 假如BERT系论文变成Commit History
  5. hadoop-0.20.2完全分布式集群
  6. 1个报表工具,5大体系,60种可视化图表,靠这些打动领导就够了
  7. 检测VC++Redistributable运行库 vcredist_x86.exe
  8. python cad自动画图软件_科研画图都用什么软件?
  9. 饥荒一直服务器没有响应,饥荒总是启动服务器进不去 | 手游网游页游攻略大全...
  10. 不加群提取群成员_快速提取PPT上的文字!
  11. 计算机管理及维护培训考试题,计算机考试题库和答案_浅析高校公共计算机机房管理与维护...
  12. C++卡常数之内存优化
  13. 武汉大学测绘学院工测带缓和曲线的圆曲线
  14. echo和narcissus寓意_希腊神话故事(一)Echo 和 Narcissus(得不到的爱)
  15. 数据化是什么,企业为什么要数据化管理?【Teamface企典】
  16. MarkDown图床助手: 截图-传图-生成url 一步到位
  17. gif验证码识别,gif动态验证码识别
  18. 建设一个SaaS平台需要知道什么,做什么(附多图)
  19. 几百块的投影仪靠谱吗?性能怎么样?
  20. 三阶齐次线性方程求通解_的三阶变系数齐次线性微分方程类型

热门文章

  1. python中的class怎么用_对python 中class与变量的使用方法详解
  2. 6.QML动画——状态与过渡
  3. 基于ECS部署LAMP环境实验记录
  4. HALCON双目三维重建实验
  5. cytoscape使用方法_信号通路分析工具教程——Cytoscape及OmniPath插件
  6. 【趣图】测试刚写完的代码...
  7. # 可视化工具资源汇总
  8. h5仿微信聊天(高仿版)、微信聊天表情|对话框|编辑器
  9. 测试驱动开发是否是一种强迫症?
  10. 安全报告显示2015年DDoS攻击强度创下新纪录