2017网易实习生编程题-笔记

第一次做招聘类的编程题,还是有点不习惯,网易这次的题明显考察的是推导和思路,实现部分相对简单,也没有涉及到一些常见算法。
这里对这次的编程题做个记录,有两题还没有想到好的解法,后面有时间再来补。

1.魔法手环

题目大意:你有一个魔法手环,他是有一组数字构成的,你每次使用魔法的时候,手环中的数字会发生变化。
变化的规律是第x位变为第x位和x+1位的合,即x[i] = x[i] + x[i + 1],最后一位会变为x[n] = x[n] + x[0]
如果求和后的结果大于等于100,则取100的余数。

输入输出

输入分为两行,第一行是两个数字,分别表示环的长度n和使用魔法的次数k,第二行输入n个数字。
要求输出经过k次变化后手环中的各位数字。

思路

乍一看题目感觉很简单,两个循环模拟下就行了,实则不然。题目中限定了k的值非常大,直接模拟我只过了60%的样例。
这种情况应该得使用数学推导,直接求经过k次变换的结果。
假如4个数,列个表格:

a b c d
a+b b+c c+d d+a
a+2b+c b+2c+d c+2d+a d+2a+b
a+3b+3c+d b+3c+3d+a c+3d+3a+b d+3a+3b+c

计算过程还是有规律的,但是求100余数之后会怎么样,这里我没想清楚…卒

2.分饼干

题目大意:有一盒饼干,饼干盒上标明了饼干的数目,但是这个数目的中间几位看不清了。现在需要将这些饼干评分给n个小朋友。
问饼干数量有多少种(这个地方有点记不清了…)。

输入输出

第一行是一个数字,代表饼干数,这个数字最大是18位,中间看不清的位用x代替。
第二行输入小朋友的数量。
输出可能的种数。

思路

第一反应是搜索题,对于看不清的数字位使用穷举,但是感觉复杂度太高,题目似乎没有限制看不清的位数,最多有18位,如果17位都看不清,好像结果显然是超时的…卒

3.男女排队

题目大意:现在有一个队伍,里面有男生和女生,目标要让男生和女生尽量避免相邻的站位(避免男生前后是女生或者女生前后是男生的情况)。每次可以交换相邻两个人的位置,问最少的交换次数。

输入输出

输入是一个字符序列,男生用’B’表示,女生用’G’表示。
例如

1
GGBBG

输出是最小的交换次数。

思路

乍看交换的情况可能比较复杂,细想了下是个简单的推导题。
首先要明确目标,要让男女相邻次数的最少,就要实现让男生和女生分布在队伍的两侧,这样只有1个相邻位。
另外,让男生站前面还是女生站前面应该取决于原先队列的前面是男生多还是女生多。
例如,前半部分男生多,那么把男生都换到前面。
交换的策略:
总人数为n,计数得到男生数量x,从前往后遍历当前队列的0-x-1位,当找到一个女生的时候结束遍历记录位置为i。然后从x-n位开始遍历,找到一个男生则结束记录位置j。此时j-i就是一趟需要的交换次数。
反复迭代这个过程,直到前x位都是男生,终止程序。