Exercise5 - Coding Skills
ParkingBill: Given two strings representing times of entry and exit from a car parking lot, find the cost of the ticket according to the given billing rules.
问题概述:本题输入是string E和string L,其中E代表了车辆的入场时间,L代表车辆出场时间,格式都是到分钟的“HH:MM”。然后需要返回的,是最终需要缴纳的停车费。计费规则具体如下:
- 入场初始费用2元
- 首小时收费3元(不满1小时按1小时算)
- 之后每小时4元(不满1小时按1小时算) 然后额外一个比较重要的题干,是E和L一定都在同一天,这样解法的复杂度就下降了。
解法概述:还是很简单的,解题思路是把E和L转化成分钟,然后相减之后就得到了停车的分钟数。再实现上述规则后即可算出正确的停车费。具体如下:
def solution(E, L):
E_hour, E_min = E.split(':')
L_hour, L_min = L.split(':')
diff_min = int(L_hour) * 60 + int(L_min) - int(E_hour) * 60 - int(E_min)
diff_H, diff_M = diff_min//60, diff_min%60
if diff_M>0:
return 2 + 3 + 4*(diff_H+1-1)
return 2 + 3 + 4*(diff_H-1)
ParityDegree: Find the highest power of 2 that divides N.
问题概述:输入是一个正整数N,需要返回的,是能够被N整除的2的最大幂次数。比如输入是24,因为2^3=8能被24整除,但是2^4=16就不行了,所以需要返回的“能被24整除的2的最大幂次数”,就是3。
解法概述:简单的贪婪算法,对N一直尝试进行除2的操作,直到余数为1。具体实现如下:
def solution(N):
power_2 = 0
while N%2==0:
power_2 += 1
N = N//2
return power_2
ThreeLetters: Given two integers A and B, return a string which contains A letters "a" and B letters "b" with no three consecutive letters being the same.
问题概述:本题输入是两个整数A和B,代表了一个字符串中,a字符(A个)和b字符(B个)的个数。需要返回的,是用这A+B个字符组成的,任意符合要求的字符串。要求则很简单,就是组成的字符串中,不能有连续的3个a或者3个b字母出现。
解法概述:本题需要返回的,是任意符合条件的解,因此我们还是可以用贪婪算法的思想来实现:首先,我们根据A和B的大小关系,确定第一位字符是a还是b,然后就循环判断剩余的a和b的数量,以及是否即将出现连续3个a/b,决定下一位字母的取值
因为按题干描述,本题至少包含一个可行解,所以我们按这个思路一定能够得到一个可行解。我们可以用反证法思考证明这一点:
假设存在并不符合我们的确定可行解思路的可行解,即在从左到右确定某一位取值时,在同时可以取a和b时,并没按“取当前剩余数量更多的字符”来确认(因为贪婪算法思路里的其他判断条件,都是满足可行的必要条件,不可能有出入),而是选择了本来剩余数量就更少的字符,那么在确认的后续位字符中,一定存在可以跟当前位字符进行交换的情况。
def solution(A, B):
# 贪婪算法
res = ''
while A>0 or B>0:
if (A>=B and res[-2:]!='aa') or res[-2:]=='bb':
res += 'a'
A -= 1
elif (B>A and res[-2:]!='bb') or res[-2:]=='aa':
res += 'b'
B -= 1
else: # 因为题目说一定有解,不应该存在这个分支的情况
break
return res