剑指offer35--数字在数组排序中出现的次数
来源:互联网 发布:淘宝卖家电话隐藏 编辑:程序博客网 时间:2024/06/07 12:01
一、题目
题目:统计一个数字:在排序数组中出现的次数。
二、举例
例如输入排序数组{ 1, 2, 3, 3, 3, 3, 4, 5}和数字3 ,由于3 在这个数组中出现了4 次,因此输出4 。
三、思想
(1)看到这个题目的第一想法就是使用遍历的方式来查找,这样当数组比较短的时候是没有 问题的,但是当数组比较长的时候就会出现执行效率的问题。
(2)第二种就是采用二分查找的方法,这样可以提高一半或者更高的效率,我使用的方式是先使用二分查找,直到找到data[middle] == k时,也就是说明k在此范围之内,统计此数两边k的个数即可。
四、程序
package 剑指offer;/*题目:统计一个数字:在排序数组中出现的次数*/public class Test38 {// 找到k的函数,也就是来确定k到底在哪个范围public static void findRange(int data[], int start, int end, int k){// 排除边界情况if(data == null || start >= end || k > data[end]){System.out.println("Error");}int middle = (start + end)/2;if(data[middle] == k){System.out.println(findNumber(data, start, end, middle, k));}else if(middle != k){findRange(data, start, middle, k);findRange(data, middle+1, end, k);}}// 找到范围之后分别从两个数k的个数并相加public static int findNumber(int data[], int start, int end, int middle, int k){int result = 0;int middleRight = middle;int middleLeft = middle;// 因为下面统计的时候统计不到,所以在这里先加上if(data[end] == k){result++;}if(data[start] == k){result++;}// 向右移动统计个数while(data[middleRight] == k && middleRight != end){middleRight++;result++;}// 向左移动while(data[middleLeft] == k && middleLeft != start){middleLeft--;result++;}return result - 1;}public static void main(String args[]){ // 查找的数字出现在数组的中间 int[] data1 = {1, 2, 3, 3, 3, 3, 4, 5}; findRange(data1, 0, data1.length - 1, 3); // 4 // 查找的数组出现在数组的开头 int[] data2 = {3, 3, 3, 3, 4, 5}; findRange(data2, 0, data2.length - 1, 3); // 4 // 查找的数组出现在数组的结尾 int[] data3 = {1, 2, 3, 3, 3, 3}; findRange(data3, 0, data3.length - 1, 3); // 4}}
五、收获
统计个数的时候要注意两边的情况,由于条件的限制,有可能会统计不上,需要做特殊处理。
1 0
- 剑指offer35--数字在数组排序中出现的次数
- 【剑指offer】数字在排序数组中出现的次数
- 剑指offer--数字在排序数组中出现的次数
- 《剑指offer》数字在排序数组中出现的次数
- 剑指offer:数字在排序数组中出现的次数
- 剑指offer-数字在排序数组中出现的次数
- 剑指offer:数字在排序数组中出现的次数
- [剑指offer]数字在排序数组中出现的次数
- 剑指offer 数字在排序数组中出现的次数
- [剑指offer]数字在排序数组中出现的次数
- 剑指offer|数字在排序数组中出现的次数
- 剑指offer-数字在排序数组中出现的次数
- 《剑指offer》-数字在排序数组中出现的次数
- 剑指offer - 数字在排序数组中出现的次数
- 剑指Offer_37_数字在排序数组中出现的次数
- 剑指-数字在排序数组中出现的次数
- 剑指offer-数字在排序数组中出现的次数
- 【剑指offer】数字在排序数组中出现的次数
- 动态计算UITableViewCell高度详解
- 安卓studio keystore的keystore sha1的获取,第三方注册
- Rabbitmq for openstack
- Android进阶之AS如何处理不同引用库(module)里jar的重复引起问题
- java学习day5
- 剑指offer35--数字在数组排序中出现的次数
- eclipse maven Tomcat7热部署
- CentOS 安装 Node.js
- swiper的基础使用(十一)
- Android原理揭秘之NavigationBar、StatusBar
- Microsoft.Practices.EnterpriseLibrary.Caching实现基于方法签名的数据集缓存
- Mac 配置多个git版本库
- 异形窗口小火箭代码
- 工作笔记