zoukankan      html  css  js  c++  java
  • 面试题38:数字在排序数组中出现的次数

    题目描述

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

    题目分析

    剑指Offer(纪念版)P204

    代码实现

    int GetNumberOfK(int* data, int length, int k)
    {
        int number = 0;
    
        if(data != NULL && length > 0)
        {
            int first = GetFirstK(data, length, k, 0, length - 1);
            int last = GetLastK(data, length, k, 0, length - 1);
            
            if(first > -1 && last > -1)
                number = last - first + 1;
        }
    
        return number;
    }
    
    // 找到数组中第一个k的下标。如果数组中不存在k,返回-1
    int GetFirstK(int* data, int length, int k, int start, int end)
    {
        if(start > end)
            return -1;
    
        int middleIndex = (start + end) / 2;
        int middleData = data[middleIndex];
    
        if(middleData == k)
        {
            if((middleIndex > 0 && data[middleIndex - 1] != k) 
                || middleIndex == 0)
                return middleIndex;
            else
                end  = middleIndex - 1;
        }
        else if(middleData > k)
            end = middleIndex - 1;
        else
            start = middleIndex + 1;
    
        return GetFirstK(data, length, k, start, end);
    }
    
    // 找到数组中最后一个k的下标。如果数组中不存在k,返回-1
    int GetLastK(int* data, int length, int k, int start, int end)
    {
        if(start > end)
            return -1;
    
        int middleIndex = (start + end) / 2;
        int middleData = data[middleIndex];
    
        if(middleData == k)
        {
            if((middleIndex < length - 1 && data[middleIndex + 1] != k) 
                || middleIndex == length - 1)
                return middleIndex;
            else
                start  = middleIndex + 1;
        }
        else if(middleData < k)
            start = middleIndex + 1;
        else
            end = middleIndex - 1;
    
        return GetLastK(data, length, k, start, end);
    }
    

      

  • 相关阅读:
    shell学习三十八天----运行顺序和eval
    开发新手教程【三】Arduino开发工具
    【Cloud Foundry】Cloud Foundry学习(四)——Service
    java调用oracle函数
    JDK动态代理
    Nginx 笔记与总结(8)Location:归纳总结
    机器学习从入门到放弃之决策树算法
    用数据分析进行品类管理
    用数据分析进行品类管理
    大数据分析过程中经常遇到那13个问题
  • 原文地址:https://www.cnblogs.com/xwz0528/p/4896169.html
Copyright © 2011-2022 走看看