我数据结构和算法很垃圾,本以为一道都做不出来,结果还是通过自己的蠢方法做了出来
但是一开始的有点小问题,考试结束才想起不太对劲。。。
现在已经修改下小错误,因为已经没有错了,有错欢迎指出来!
题目如下:
Python3 代码如下:
代码看上去很多,其实有很多注释,而且其实思路很简单
代码丑陋,上面也说道,我的数据结构和算法很垃圾的,只是有个思路做出这道题,
不喜勿喷……
def min_press(string, length):
if string.lower() == string:
return length
if string.upper() == string:
return length + 1
count = 0 # 所需的最小按键数
flag = False # 大小写模式标志位,默认一开始为小写(其中小写用False表示,大写用True表示)
for i in range(length):
# 特殊情况:到了最后一个元素之后是没有i+2的,会超出索引
# 所以需要对倒数第二个开始做下特殊处理,这里就一次把最后2个所需按键总数算出来
# 最后两个只有4种情况,aa(小小),aA(小大),Aa(大小),AA(大大)
if i == length - 2:
if not flag:
# 当前为小写模式,且最后两个为aa(小小),才+2
if string[i].islower() and string[i+1].islower():
count += 2
# 剩下的3种情况都是+3,可以自行理解下
else:
count += 3
else:
# 这里的分析也类似上面的
if string[i].isupper() and string[i+1].isupper():
count += 2
else:
count += 3
return count
# 以下为正常情况下
# 如果当前为小写模式
if not flag:
# 考虑下首字符这种特殊情况
if i == 0:
i -= 1
# 如果下一个字母还是小写,直接+1
if string[i+1].islower():
count += 1
# 下一个是大写,再下一个是小写,那就临时切换
elif string[i+1].isupper() and string[i+2].islower():
count += 2
# 下一个是大写,再下一个也是大写,那就永久切换
elif string[i+1].isupper() and string[i+2].isupper():
flag = True
count += 2
# 如果当前是大写模式
else:
# 下一个字母还是大写,直接+1
if string[i+1].isupper():
count += 1
# 下一个是小写,再下一个是大写,那就只是临时切换
elif string[i+1].islower() and string[i+2].isupper():
count += 2
# 下一个是小写,再下一个还是小写,那就永久切换
elif string[i+1].islower() and string[i+2].islower():
flag = False
count += 2
return count
while True:
str_len = int(input().strip())
string = input().strip()
print(min_press(string, str_len))
#京东##秋招##笔试题目##前端工程师#