题目来自于https://blog.youkuaiyun.com/song2016/article/details/81187109
以下记录想法与python核心代码
题目1:
Alice、Bob、Cathy、Dave四个人排队喝可乐,喝完一个人变两个,接着继续到队尾排队,问第N个人喝可乐的人是谁
如:N=8: ABCDAABB,第八个人是B,
分析:
i = 0 people = 4
i = 1 people = 4 + 4*2
i = 2 people = 4 + 4*2 + 4*2*2
I = n people = 4 + 4*2 + .. + 4*(2**n)
= 4*(2**0 + 2**1 + .. + 2**n) = 4*(2**n - 1) # 利用等比数列求和公式得到
i = 0
while 4 * (2**i - 1) < n:
i += 1
cut = (n - 4 * (2**(I-1) - 1)) / 2**(I) 即得到ID
题目2:
N个球星,M个人评级,共a-z 26个级别,a最高,z最低,球星X比球星Y评级高,则认为球星X强于球星Y,所有一个球星强于其他所哟球星,则认为其为球王。问谁能得到球王称号
例1:N=4,M=3,评价为acbd,bacd,bdca,输出为0;
例2:N=3,M=3,评价为abc,bca,cab,输出为-1.
分析:
这个题把所有的求和级别转成数字加起来直接比较能有70%,后来在牛客网上看到一个讨论觉得很有道理,不应该用总和来求,应该用字母的优先级来求即如下例子:
输入为N=2,M=3,评价为:aa,ba,bc,输出应该为1,因为这里是abb,aac,虽然总数一样,但是应该是1强于0的
解决方案:
1. 使用数字加和,但要求a-z每三个相邻字母的赋值都要满足a=b+c+1,即可避免上述情况
2.