第37题——数字在排序数组中出现的次数

133 阅读1分钟

题目:

统计一个数字在排序数组中出现的次数。

思路:

在排序数组中先找到这个数字k,再查看它是否是第一个k,若是统计后边的k,若否向前统计并加上后边统计的。

Java

package nowcoder;

public class S37_GetNumberOfK {
    public int GetNumberOfK(int[] array, int k){
        int position = getPosition(array, k, 0, array.length-1);
        System.out.println(position);
        if (position == -1)
            return 0;
        //sum记录k的数量
        int sum=0;
        for (int i=position;i<array.length;i++){
            if (array[i] == k)
                sum++;
            else break;
        }
        return sum;
    }
    //找到第一个k的位置
    public int getPosition(int[] array, int k, int start, int end){
        if (start > end)
            return -1;
        int mid = (start + end) >> 1;
        if (array[mid] > k)
            return getPosition(array, k, start, mid-1);
        else if (array[mid] < k)
            return getPosition(array, k, mid+1, end);
        //若mid前的数值也等于k
        else if (mid-1 >= 0 && array[mid-1] == k)
            return getPosition(array, k, start, mid-1);
        else return mid;
    }
    public static void main(String[] args){
        S37_GetNumberOfK s37 = new S37_GetNumberOfK();
        int[] array = {1, 2, 3, 4, 5, 5, 5, 5, 5, 5, 6, 7, 8, 8};
        System.out.println(s37.GetNumberOfK(array, 5));
    }
}

Python

class GetNumberOfK:
    def GetNumberOfK(self, array, k):
        first = self.getFirstK(array, k, 0, len(array)-1)
        last = self.getLastK(array, k, 0, len(array)-1)
        return last - first+1
    #递归找第一个k
    def getFirstK(self, array, k, start, end):
        if start>end:
            return -1;
        mid = (start + end) >> 1
        if array[mid] > k:
            return self.getFirstK(array, k, start, mid-1)
        elif array[mid] < k:
            return self.getFirstK(array, k, mid+1, end)
        elif array[mid-1] == k and mid-1>=0:
            return self.getFirstK(array, k, start, mid-1)
        else:
            return mid
    #循环找最后一个k
    def getLastK(self, array, k, start, end):
        while start <= end:
            mid = (start + end) >> 1
            if array[mid] == k and array[mid+1] != k or mid == len(array)-1:
                return mid
            else:
                if array[mid] > k:
                    end -= mid
                else:
                    start += mid
        return -2
if __name__ == '__main__':
    test = GetNumberOfK()
    array = [1, 2, 3, 4, 5, 5, 5, 5, 5, 5, 6, 7, 8, 8]
    print(test.GetNumberOfK(array, 5))