数组中出现次数超过一半的数字

时间:2021-06-20 11:02:19

    题目:数组中有一个数字出现的次数超过数字长度的一半,请找出这个数字。例如输入一个长度为9的数组{1, 2,3, 2, 2, 2, 5, 4, 2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。

    解题思路:数组中有一个数字出现的次数超过数组长度的一半,它出现的次数比其他所有数字出现的次数的和还要多。我们在遍历数组的时候保存两个值:一个是数组中的一个数字,一个是次数。当遍历到下一个数字的时候,如果下一个数字和之前保存的数字相同,则次数加1;如果下一个数字和之前保存的数字不同,则次数减1。如果次数为0,保存下一个数字,并把次数设置为1。要找的数字肯定是最后一次把次数设为1时对应的数字。

    C#实现:

private static bool CheckInvalidArray(int[] numbers, int length)        {
            bool bInputInvalid = false;

            if (numbers == null || length <= 0)
                bInputInvalid = true;

            return bInputInvalid;
        }

        private static bool CheckMoreThanHalf(int[] numbers, int length, int number)
        {
            int times = 0;
            for (int i = 0; i < length; i++)
                if (numbers[i] == number)
                    times++;

            bool isMoreThanHalf = true;
            if (times * 2 <= length)
            {
                isMoreThanHalf = false;
            }

            return isMoreThanHalf;
        }

        public static int MoreThanHalfNum(int[] numbers, int length)
        {
            if (CheckInvalidArray(numbers, length))
                return 0;

            int result = numbers[0];
            int times = 1;
            for (int i = 1; i < length; i++)
            {
                if (times == 0)
                {
                    result = numbers[i];
                    times = 1;
                }
                else if (numbers[i] == result)
                    times++;
                else
                    times--;
            }

            if (!CheckMoreThanHalf(numbers, length, result))
                result = 0;

            return result;
        }

    Java实现:

private static Boolean CheckInvalidArray(int[] numbers, int length) {Boolean bInputInvalid = false;if (numbers == null || length <= 0)bInputInvalid = true;return bInputInvalid;}private static Boolean CheckMoreThanHalf(int[] numbers, int length, int number) {int times = 0;for (int i = 0; i < length; i++)if (numbers[i] == number)times++;Boolean isMoreThanHalf = true;if (times * 2 <= length) {isMoreThanHalf = false;}return isMoreThanHalf;}public static int MoreThanHalfNum(int[] numbers, int length) {if (CheckInvalidArray(numbers, length))return 0;int result = numbers[0];int times = 1;for (int i = 1; i < length; i++) {if (times == 0) {result = numbers[i];times = 1;} else if (numbers[i] == result)times++;elsetimes--;}if (!CheckMoreThanHalf(numbers, length, result))result = 0;return result;}

    Python实现:

def check_invalid_array(numbers, length):    b_input_invalid = False    if numbers == None or length <= 0:        b_input_invalid = True    return b_input_invaliddef check_more_than_half(numbers, length, number):    times = 0    for item in numbers:        if item == number:            times += 1    is_more_than_half = True    if times *2 <= length:        is_more_than_half = False    return is_more_than_halfdef more_than_half_num(numbers, length):    if check_invalid_array(numbers, length):        return 0    result = numbers[0]    times = 1    for item in numbers:        if times == 0:            result = item            times = 1        elif item == result:            times += 1        else:            times -= 1    if not check_more_than_half(numbers, length, result):        result = 0    return result