• 【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

  • 相关阅读:
    [2021Fall] Lab10 of CS61A of UCB
    [2021Fall]Project3. Ants vs. Bees of CS61A of UCB
    [2021Fall] Hw09 of CS61A of UCB
    [2021Fall] Hw08 of CS61A of UCB
    Windows平台下Git服务器搭建
    使用NSSM把asp.Net Core webapi部署至 Windows 服务
    内向性格的力量
    访问者模式学习笔记
    Serverless计算
    Linux TOP 命令
  • 原文地址:https://www.cnblogs.com/haoworld/p/offer531-shu-zi-zai-pai-xu-shu-zu-zhong-chu-xian-d.html
Copyright © 2020-2023  润新知