第一组

这组相对简单,相信大家基本都能够解出来。
主要可以利用map结构,形成KEY,V结构统计数量,便利一遍投票数组,在便利一遍map就能够得到结果。代码我就不提供了

第二组

这个就要费点头脑了,关键性的就是大于一半这个结果。如果要大于了一半,有啥现象。
先从简单的来:比如 [1,2,2,1,1,3,1] 。其实可以想象成这样 [1,a,a,1,1,a,1] 。就是除了自己都是对立的,只要当成两组来统计就行了。
只要跟自己一样就对自己的统计进行+1 不一样就-1 。
所以需要两个东东,一个是记录当前值的变量叫做统计值,一个是统计当前值数量的东东。
如果当前统计数量为0*(没有值)就把便利的值作赋值统计值,且数量为1
如果当前统计数量的值>0 且当前便利的值等于统计值 统计数量+1
如果当前统计数量的值>0 且当前便利的值不等于统计值 统计数量-1

最终会得到统计值为1 或者没有统计值。
如果有统计值,只需要在便利一遍数组确定下统计值的统计数量。如果数量大于数组长度一半。就返回该结果
如果不大于,就返回空值,或者一个能判断没有结果的值。

代码地址

gitee地址 https://gitee.com/moyoutian/data-structure-and-algorithm/tree/master

第二组代码实现

Demo1

import com.moyoutian.utils.ArrayUtils;

public class Demo1 {

    public static void main(String[] args) {

        //初始化投票 随机数组 人名就暂定为数字编号 ,参数1数组长度,参数2,随机数的最大值
        int[] names = ArrayUtils.getIntAr(5, 2);
        System.out.println(Arrays.toString(Arrays.stream(names).toArray()));
        int name = getName(names);
        if (name == -1) {
            System.out.println("没有候选者");
        } else {
            System.out.println("候选者为:" + name);
        }

    }


    /**
     * 第二组实现
     *
     * @param ints 候选人数组
     */
    public static int getName(int[] ints) {
        //候选者编号
        int p = -1;
        // 血量
        int ph = 0;
        // 先便利一遍数组
        for (int i = 0; i < ints.length; i++) {
            //如果血量为0,当前值变为候选者,血量+1
            if (ph == 0) {
                p = ints[i];
                ph++;
            } else if (p == ints[i]) {
                //如果血量为不为0,当前值变等于候选者,血量+1
                ph++;
            } else {
                //如果血量为不为0,当前值变等于候选者,血量-1
                ph--;
            }
        }
        // 在便利一变数据确定候选者的数量是否大于数组长度的一半
        if (p != -1) {
            //重置血量
            ph = 0;
            for (int i = 0; i < ints.length; i++) {
                if (p == ints[i]) {
                    ph++;
                }
            }

            if (ph > ints.length / 2) {
                return p;
            }
        }
        return -1;
    }
}

ArrayUtils

import java.util.Random;

/**
 * 数组工具类
 */
public class ArrayUtils {


    private static final Random random_10 = new Random(10);

    /**
     * 获取一个String 数组
     *
     * @param l 数组长度
     * @param bound 随机数的最大值
     * @return String 数组
     */
    public static int[] getIntAr(int l, int bound) {
        return setRoundNumber(new int[l], bound);
    }

    public static int[] setRoundNumber(int[] ints, int bound) {

        for (int i = 0; i < ints.length; i++) {
            ints[i] = random_10.nextInt(bound);
        }
        return ints;
    }


}