1. 靠谱的车
1.1. 题目描述
程序员小明打了一辆出租车去上班。出于职业敏感,他注意到这辆出租车的计费表有点问题,总是偏大。
出租车司机解释说他不喜欢数字4,所以改装了计费表,任何数字位置遇到数字4就直接跳过,其余功能都正常。
比如:
23再多一块钱就变为25;
39再多一块钱变为50;
399再多一块钱变为500;
小明识破了司机的伎俩,准备利用自己的学识打败司机的阴谋。
给出计费表的表面读数,返回实际产生的费用。
1.2. 输入描述
只有一行,数字N,表示里程表的读数。
(1<=N<=888888888)。
1.3. 输出描述
一个数字,表示实际产生的费用。以回车结束。
1.4. 用例
输入 5
输出 4
说明
5表示计费表的表面读数。
4表示实际产生的费用其实只有4块钱。
输入 17
输出 15
说明
17表示计费表的表面读数。
15表示实际产生的费用其实只有15块钱。
输入 100
输出 81
说明
100表示计费表的表面读数。
81表示实际产生的费用其实只有81块钱。
1.5. 题目解析
进制转换问题,从9 ^ (n - 1)
换算成10 ^ (n - 1)
就行了
1.6. 代码
class Solution:
def __call__(self, nums: str):
ans = 0
for i, num in enumerate(nums[::-1]):
num = int(num) - (num > '4')
ans += 9 ** i * num
return ans
2. 括号匹配
2.1. 题目描述
给定一个字符串,里边可能包含“()”、“[]”、“{}”三种括号,请编写程序检查该字符串中的括号是否成对出现,且嵌套关系正确。
若括号成对出现且嵌套关系正确,或该字符串中无括号字符,输出:true;
若未正确使用括号字符,输出:false。
实现时,无需考虑非法输入。
2.2. 输入描述
无
2.3. 输出描述
无
2.4. 用例
输入 (1+2)/(0.5+1)
输出 true
说明 无
2.5. 题目解析
2.6. 代码
class Solution:
def __call__(self, string: str):
stack = []
left, right = '[({', '])}'
for char in string:
if char not in left + right:
continue
if char in left:
stack.append(char)
continue
index = right.index(char)
if stack and stack[-1] == left[index]:
stack.pop()
else:
return False
return not bool(stack)
3. 连续字母长度
3.1. 题目描述
给定一个字符串,只包含大写字母,求在包含同一字母的子串中,长度第 k 长的子串的长度,相同字母只取最长的那个子串。
3.2. 输入描述
第一行有一个子串(1<长度<=100),只包含大写字母。
第二行为 k的值
3.3. 输出描述
输出连续出现次数第k多的字母的次数。
3.4. 用例
输入
AAAAHHHBBCDHHHH
3
输出 2
说明
同一字母连续出现的最多的是A和H,四次;
第二多的是H,3次,但是H已经存在4个连续的,故不考虑;
下个最长子串是BB,所以最终答案应该输出2。
输入 AABAAA
2
输出 1
说明
同一字母连续出现的最多的是A,三次;
第二多的还是A,两次,但A已经存在最大连续次数三次,故不考虑;
下个最长子串是B,所以输出1。
输入 ABC
4
输出 -1
说明 只含有3个包含同一字母的子串,小于k,输出-1
输入 ABC
2
输出 1
说明 三个子串长度均为1,所以此时k = 1,k=2,k=3这三种情况均输出1。特此说明,避免歧义。
3.5. 题目解析
题目很绕,但是就是让遍历一下统计个数,然后按照个数排序
3.6. 代码
class Solution:
def __call__(self, string: str, k: int):
records = {}
cnt = 0
last_char = string[0]
for char in string + ' ':
if char != last_char:
records[last_char] = max(records.get(last_char, 0), cnt)
cnt = 1
last_char = char
else:
cnt += 1
return sorted(records.items(), key=lambda x: x[1], reverse=True)[k - 1]