zoukankan      html  css  js  c++  java
  • 【Offer】[53-1] 【数字在排序数组中出现的次数】

    题目描述

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

    牛客网刷题地址

    思路分析

      利用二分查找法查找到第一个k和最后一个k出现的位置,就可以统计出k出现的次数,比较k与中间值mid的大小:

    1. 如果k小于mid,则第一个k出现在前半部分,
    2. 如果k大于mid,则第一个k出现在后半部分,
    3. 如果相等,这是判断中间值是否是第一个k,如果中间值前面的值还是k,则第一个k出现在前半部分。

    测试用例

    1. 功能测试:数组中包含要查找的数字;数组中没有要查找的数字;要查找的数字在数组中出现一次/多次。
    2. 边界值测试:查找数组中的最大值、最小值;数组中只有一个数字。
    3. 特殊输入测试:表示数组的指针为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代码-Java

  • 相关阅读:
    Lucene学习总结之二:Lucene的总体架构
    Lucene学习总结之三:Lucene的索引文件格式(1)
    android开发_SeekBar进度条
    android开发_mp3_player音乐播放器
    Lucene学习总结之一:全文检索的基本原理
    android开发_Intent_requestCode_resultCode页面之间的跳转
    android开发_Location位置定位
    .NET Remoting Basic(7)信道
    .NET Remoting Basic(1)概览
    .NET Remoting Basic(5)多服务器访问和程序集共享
  • 原文地址:https://www.cnblogs.com/haoworld/p/offer531-shu-zi-zai-pai-xu-shu-zu-zhong-chu-xian-d.html
Copyright © 2011-2022 走看看