剑指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
原创粉丝点击