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;
    }
    
  • 相关阅读:
    ANDROID_MARS学习笔记_S04_004_用HTTPCLENT发带参数的get和post请求
    ANDROID_MARS学习笔记_S04_003_用HttpClent发http请求
    ANDROID_MARS学习笔记_S04_002_用AsyncTask实现异步操作
    ANDROID_MARS学习笔记_S04_001_OAUTH获取request_token
    ANDROID_MARS学习笔记_S04_001_OAuth简介
    ANDROID_MARS学习笔记_S03_009_GOOGLEMAP3
    ANDROID_MARS学习笔记_S03_008_GOOGLEMAP2
    ANDROID_MARS学习笔记_S03_007_GoogleMap1
    适配ios9出现的问题:-canOpenURL: failed for URL
    使用第三方SDK出现: duplicate symbol _llvm.cmdline in:
  • 原文地址:https://www.cnblogs.com/heyonggang/p/3642322.html
Copyright © 2011-2022 走看看