4.15 米哈游笔试
20:00 - 22:00 看起来基本是寄了
10个单选 10个不定项选择 3个算法题
选择题涉及:进程线程、TCP/UDP、js 原型,resolve,输入输出,css flex模型
算法题
首先我不熟悉输入输出,在这个 ACM 的界面磨蹭了半天才开始写,有点抽象
然后后面就基本没时间写了
1. 正整数
给一个偶数位正整数,分割成两部分后求和,求和的最小值。
例如输入4321,输出64。
思路基本上是从中间切,或者中间的+1-1位置切
但是从中间切就过了85%了,乐
2. 反应
给一个 n * m 的矩形,格子内随机存在 T 和 I,如果 T 和 I 处在相邻位置(上下左右)会反应。
输出反应后的矩形
输入:
3 4
T I T .
. . . I
. T . I
输出:
. . . .
. . . I
. T . I
思路就是遍历,然后看上下左右有没有相反的元素,开一个新布尔数组用于记录该位置有没有反应,先全值为 false,反应了就置 true。最后再遍历一遍统一处理输出。
3. 猜数组
有两个数组 a 和 b,遵循以下规律:
- $b_i = a_i + a_{i+1}$
a.length = b.length + 1- a 数组的元素均为正整数
给你 a 数组的长度和 b 数组,返回 a 数组所有可能的情况的数量。
输入:
3
3 4
输出:
2
解释:数组 a 有可能是[1,2,2]或[2,1,3],共两种情况,故返回2.
思路:寻找 $a_0$ 的大小范围即可
因为 a 数组的元素均为正整数,所以显然 b 数组的元素也都是正整数。
当 $a_0$ 确定了,后面的数字也就跟着确定了,于是问题转化为确定 $a_0$ 的范围。
从 $a_i > 0$ 着手:因为 $b_i = a_i + a_{i+1}$ ,所以可以举例:
首先,$a_0 >0$ ;
$i=0$ 时, $b_0 = a_0 + a_{1}$, => $a_1 = b_0 - a_0$ ,因为 $a_1 > 0$ ,=> $b_0-a_0>0$ ,=> $a_0 < b_0$ 。
因为已经知道 $b_0$ 的值,所以此时 $0<a_0<b_0$ 。
$i=1$ 时,可以得到 $a_0 > -b_1+b_0$ ;
$i=2$ 时,可以得到 $a_0 < b_2 -b_1+b_0$ ;
$i=3$ 时,可以得到 $a_0 > b_3 + b_2 -b_1+b_0$ ;
至此得到规律,当处理到 b 数组的偶数位时,限制的是 $a_0$ 的上限;当处理到 b 数组的奇数位时,限制的是 $a_0$ 的下限。
所以只需要从头开始遍历 b 数组,取两个数 max、min 为上下限,当处理到奇数位时如果大于min则更新,当处理到偶数为时如果小于max则更新。特殊情况,若 max < min 则返回0。
最后返回 max - min - 1 即可(因为 $a_0$ 的取值范围是 (min, max),即从 min+1 到 max-1的数字的数量)。