数据结构与算法练习-题目1-解题思路及代码
原题链接
https://blog..net/u014738571/article/details/119184373
第一组
这组相对简单,相信大家基本都能够解出来。 主要可以利用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 或者没有统计值。 如果有统计值,只需要在便利一遍数组确定下统计值的统计数量。如果数量大于数组长度一半。就返回该结果 如果不大于,就返回空值,或者一个能判断没有结果的值。
代码地址
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; } }