P1
Problem description:
总共有1024元,买一件价格为N元的商品,N为1到1024间的整数。
找零都以硬币形式给出,可能值为1元,4元,16元,64元。问最少找零硬币数。
Soution:
典型的递归问题。
python code:
1 | def how_many_coins(x): |
output:
1 | 2 |
P2
Problem description:
给定一字符串,对其做如下修改: 若出现AABB, 修改为AAB;若出现连续三个或以上的A,比如AAA,修改为AA;算法从前向后匹配,譬如碰到AABBCC,就改为AABCC。
Solution:
对一个字符串从前往后搜索,并维护一个至多有两个元素的字典。算法复杂度为O(n)。
python code:
1 | def correct(x): |
output:
1 | aab |
P3
Problem description:
n个人围坐成一个圈,每个人都被分配了一个数字,现在给所有人分发礼物,分礼物时要满足如下条件:如果某人分配到的数字大于他左手边的人,那么他得到的礼物必须也比他左手边的人得到的礼物多;同理右手边也一样。已知每人至少能拿到一件礼物,问最少需要分配的礼物总数。
Solution:
首先给所有人一个礼物,然后从分配到最小的数字的人开始,顺时针扫一遍,按题目要求更新每个人的礼物数。然后逆时针扫一遍,在顺时针扫完一遍的基础上更新每个人的礼物数,算法复杂度为O(n)。
python code:
1 | def minPrize(num, scores): |
output:
1 | 6 |
P4
Problem description:
有M根绳子,长度由一个M个元素的列表给出,要把这M根绳子切成N段等长为L的绳子,问L的最大值。
Solution:
这道题比较难。感谢狂魔提供的解题思路。需要用到一个前提假设:即最长的那根绳子切的段数不得少于比它短的绳子。为此我们维护一个M元数组,数组的每一项表示该绳子被使用的段数。举个例子,M=[2,4],N=3。此时凭直觉给出答案L=2。具体实现方法是把长度为4的绳子且为两段,长度为2的绳子不动。在这个例子中,我们首先降序sort这个M元的列表,得到M’=[4,2],然后建立一个长度为M的新列表K,新列表的第i个元素表示M’[i]这条绳子被利用了多少段,这里,K=[2,1]。有了这个思路以后,我们只需要穷举所有可能的绳子切割方法,并计算出每一种方法L的值,再从所有方法中挑出最大的L即可。
python code:
1 | # permute function can generate all possible combinations of cutting max_len ropes into N ropes. |