• 数字在排序数组中出现的次数


    题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{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;
    }
    
  • 相关阅读:
    顺序查找
    折半查找
    KMP
    php长时间的脚本,报502
    AcWing 27. 数值的整数次方
    acwing 25. 剪绳子
    Best Cow Line <挑战程序设计竞赛> 习题 poj 3617
    acwing 23. 矩阵中的路径
    AcWing 34. 链表中环的入口结点
    AcWing 33. 链表中倒数第k个节点
  • 原文地址:https://www.cnblogs.com/heyonggang/p/3642322.html
Copyright © 2020-2023  润新知