程序员代码面试指南刷题--第八章.在数组中找到出现次数大于一半的数

题目描述
给定一个整型数组arr,请打印其中出现次数大于一半的数,如果没有这样的数,请输出-1。
输入描述:

输入包含两行,第一行包含一个整数n,代表数组长度,第二行包含n个数,代表数组arr。

输出描述:

输出一个整数,代表出现次数大于一半的数,如果没有这样的数,请输出‘-1“。

示例1

输入

5
11 7 5 7 7

输出

7

解法一:两两相消

import java.io.*;
import java.util.*;
public class Main{
    public static void main(String[] args)throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine().trim());
        String[] ss = br.readLine().trim().split(" ");
        int[] arr = new int[n];
        for(int i=0;i<n;i++){
            arr[i] = Integer.parseInt(ss[i]);
        }
        int res = getRes(arr);
        System.out.println(res);
    }
    public static int getRes(int[] arr){
        if(arr==null||arr.length<2) return -1;
        int times = 0;
        int pre = 0;
        for(int i=0;i<arr.length;i++){
            if(times==0){
                pre = arr[i];
                times = 1;
            }else if(pre==arr[i]){
                times++;
            }else{
                times--;
            }
        }
        if(times==0){
            return -1;
        }
        times = 0;
        for(int i=0;i<arr.length;i++){
            if(arr[i]==pre){
                times++;
            }
        }
        return times>arr.length/2?pre:-1;
    }
}

你可能感兴趣的:(程序员代码面试指南刷题)