第一组
这组相对简单,相信大家基本都能够解出来。
主要可以利用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;
}
}