又是大放水的一期,连我都可以10分钟解决战斗了。得益于Python,前面三题5分钟内就pass了,而最后一题也是之前刷过类似的。。。于是相应地,这期的题解也会简短一些。
这次的好成绩代表不了实力,但也希望这样的好运气能一直保持。:)
第一题:C++难题-大数加法
大数一直是一个c语言的一个难题。现在我们需要你手动模拟出大数加法过程。请你给出两个大整数加法结果。
分析
Python骗分专属。题目都说了,C++难题,但不是Python的难题啊。Python里默认整数都是长整型,不存在数据溢出的问题,所以直接返回两数之和就pass了,一分钟之内。
参考代码
n = int(input().strip())
m = int(input().strip())
print(n + m)
第二题:最长回文串
找出最先出现的最长回文串(“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串)。
分析
一眼看去还以为要用到那个难懂的“马拉车”算法,再不济也要从中心枚举之类的,结果先手试了暴力,竟然就过了。。。
做法就是从左向右、从长到短,暴力穷举所有字符串,检查是否是回文(逆转字符串与原字符串相等),一旦找到就立即结束搜索,打印答案。这里使用自定义函数solution的做法,可以省去break嵌套循环的麻烦(当然题目也自带了函数模板)。
参考代码
def solution(str):
n = len(str)
for i in range(n-1, 0, -1):
for j in range(n-i):
temp = str[j:j+i+1]
if temp==temp[::-1]:
return temp
str = input().strip()
print(solution(str))
第三题:求最小元素
假设按照升序排序的数组在预先未知的某个点上进行了旋转,请找到数组中最小元素,(例如数据[0,1,2,4,5,6,7]可能变 为[4,5,6,7,0,1,2],最小元素是0)。您可以假设阵列中不存在重复项。
分析
又是一道“谜底就在谜面上”的大水题。找到数组中最小元素,和数组是不是升序、有没有旋转有什么关系?将信将疑地使用 min 函数找出数组最小值,结果pass了。。。1分钟之内。
墙裂怀疑本题出错了。
参考代码
n = int(input().strip())
arr = [int(item) for item in input().strip().split()]
print(min(arr))
第四题:最大数
给定任意一个数字 m,然后给出数字 n,则需在 m 中去掉 n 位数,保持各位顺序不变的情况下,得到最大数。
示例:
示例 输入 12314 3
输出 34
分析
曾经在问答区帮别人回答过类似的问题,所以一眼看到题目就有了思路:把原问题中的取走 n 个数使得剩下的数字最大,变成新问题:取走 len(m)-n 个数,使它们组成的数字最大。
很显然,新问题里我们每次都要试着取最大的数字。但是题目有个很关键的要求是,不能改变数字相对的顺序。也就是说,如果我们在12314中取走了3,那么下一个数字就只能在3后面的14中取了。所以这里就带来一个小问题:可能剩下的数字个数不够,比如我们还要取三个数,但只剩下1和4两个数了。在这种情况下,前面就不能取走最大的数字3了,而是应该在它前面的数字里再寻找最大的数字,然后重复判断,直到取走某个次大的数字后,剩下的数字个数足够。
由于在取数的过程中需要改变原来的字符串 m 表示剩下哪些数,而且查找最大的数字也需要遍历(可以使用字典优化),最差的情况比如 m=123456,n=1,用这种方法就要取五个数,而每取一个数都要遍历 len(m) 遍字符串 m。如果用 m 代表 len(m) 的话,时间复杂度应该是 ,但是在比赛中能够pass此题,说明 m 也不会太大。
参考代码一
m, n = input().strip().split()
n = int(n)
l = len(m)
if n >= l: # 如果要取走的数字大于m的长度,则剩下0
print(0)
elif n == 0: # 如果要取走0个数,则剩下就是m
print(m)
else:
res = ""
i = 0
p = m.index(max(m))
while i < l-n:
if len(m)-p >= l-n-i:
res += m[p]
m = m[p+1:]
if m: p = m.index(max(m))
i += 1
else:
p = m.index(max(m[:p]))
print(res)
其实上面的代码是有些繁琐的,思路也不够简洁,复盘的时候可读性不高,在比赛过程中看到pass了就提交了。赛后想想,其实可以直接模拟:循环 n 次,每次从 m 中取走一个数,使得剩下的数最大即可。如果算上字符串拼接,时间复杂度依然是 ,m代表字符串m的长度。直觉上应该还可以再优化,以后想到再更新吧。
参考代码二
m, n = input().strip().split()
n = int(n)
if n >= len(m):
print(0)
elif n == 0:
print(m)
else:
for _ in range(n):
maxn = 0
for i in range(len(m)):
temp = int(m[:i]+m[i+1:])
maxn = max(maxn, temp)
m = str(maxn)
print(maxn)