zoukankan      html  css  js  c++  java
  • 数字在排序数组中出现的次数

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

    找到排序数组中的第一个K:

    int GetFirstK(int *data, int length, int k, int start, int end)
    {
        if(start > end)
            return -1;
        
        int middleIndex = start + ((end - start) >> 1);
        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:

    int GetLastK(int *data, int length, int k, int start, int end)
    {
        if(start > end)
            return -1;
        
        int middleIndex = start + ((end - start) >> 1);
        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);
    }
    

     在分别找到第一个k和最后一个k的下标之后,就能计算出k在数组中出现的次数了。相应的代码如下:

    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;
    }
    

    完整代码如下:

    int GetFirstK(int *data, int length, int k, int start, int end)
    {
        if(start > end)
            return -1;
        
        int middleIndex = start + ((end - start) >> 1);
        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);
    }
    
    int GetLastK(int *data, int length, int k, int start, int end)
    {
        if(start > end)
            return -1;
        
        int middleIndex = start + ((end - start) >> 1);
        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);
    }
    
    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;
    }
    
  • 相关阅读:
    At least one JAR was scanned for TLDs yet contained no TLDs
    {转} MJPG流媒体在HTML5的呈现方案
    {转}理解HTTP/304响应
    blueimp,预览遮罩范围控制
    快速生成mysql上百万条测试数据
    mysql插入文本文档及读取
    tomcat启动报错:注释指定的bean类.与现有的冲突.相同的名称和类
    csv的文件excel打开长数字后面位变0的解决方法
    UNIX或LINUX时间戳转时间
    Myeclipse更新SVNStatusSubscriber 时报告了错误。1 中的 0 个资源已经同步。
  • 原文地址:https://www.cnblogs.com/heyonggang/p/3642322.html
Copyright © 2011-2022 走看看