赞
踩
考试时间:2022-06-22
总分:136分
第一题:字符串分割-水仙花数(用例通过率:11.1%)
第二题:内存资源分配(用例通过率:95.8%)
第三题:模拟内存分配(用例通过率:15%)
之前在网上也看了很多分享,虽然机考没通过,不过也分享一下遇到的考题。
说明:
1.试题是考后在网上找的原题或比较类似的题。
2.部分代码是考试时候写的,可能写的有点乱。考试时候只管用例通过率,不讲究格式或有没有冗余代码。
第一题 字符串分割-水仙花数
题目描述
给定非空字符串s,将该字符串分割成一些子串,使每个子串的ASCII码值的和均为水仙花数。
1、若分割不成功,则返回0
2、若分割成功且分割结果不唯一,则返回-1
3、若分割成功且分割结果唯一,则返回分割后子串的数目
输入描述
输入字符串的最大长度为200
输出描述
根据题目描述的情况,返回相应的结果
示例1
输入
abc
输出
0
说明
分割不成功
示例2
输入
f3@d5a8
输出
-1
说明
分割成功但分割结果不唯一,可以分割为两组,一组’f3’和’@d5a8’,另外一组’f3@d5’和’a8’
示例3
输入
AXdddF
输出
2
说明
分割成功且分割结果唯一,可以分割成’AX’和’dddF’(370)两个子串
备注
“水仙花数”是指一个三位数,每位上数字的立方和等于该数字本身,如371是’水仙花数’,因371 = 3^3 + 7^3 + 1^3
#以下代码用例通过率为:11.1% s = input() l = [] tem = [] c = [] for i in s: l.append(ord(i)) for i in range(len(s)): for j in range(i,len(s)+1): if l[i:j] not in tem and len(str(sum(l[i:j]))) == 3: tem.append(str(sum(l[i:j]))) for i in tem: if int(i[0])**3+int(i[1])**3+int(i[2])**3 == int(i): c.append(int(i)) if len(c) == 0: print(0) else: if sum(l) == sum(c): print(len(c)) else: print(-1)
说明:本题我在考试的时候理解成只要能分出水仙花数就算分割成功。其实应该是分割的每个子串都是水仙花数才能算分割成功。不过这题在分组上确实也有难点,因为即使子串已经是水仙花数了,再加字符可能仍然是水仙花数。一个字符串可以分割出很多个水仙花数,也存在多个分组。这样应该用到回溯来解此题。
考后结合评论区兰夜的提示和想到力扣93题复原IP地址用到的回溯方法,重新解此题:
首先:咋们以s = "f3@d5a8"为例,利用回溯方法找一下可能的具体分组
# 1.提取字符及其ASCII码 s = "f3@d5a8" ls =list(s) nums = [] for i in s: nums.append(ord(i)) # 2.列出所有三位数的水仙花数 narcissus_nums = [] for i in range(100,1000): i = str(i) if int(i[0])**3+int(i[1])**3+int(i[2])**3 == int(i): narcissus_nums.append(int(i)) # 3.回溯 def backtrack(ls,nums,stk): if sum(nums) in narcissus_nums: stk.append("".join(ls)) res.append(stk[:]) stk.pop() return for i in range(1,len(nums)): if sum(nums[:i]) in narcissus_nums: stk.append("".join(ls[:i])) backtrack(ls[i:],nums[i:],stk) stk.pop() res = [] backtrack(ls,nums,[]) # 4.输出 print(res)
输出结果:
[['f3', '@d5a8'], ['f3@d5', 'a8']]
其次:按输出要求,修改为如下代码:
# 1.提取字符及其ASCII码 s = input() ls =list(s) nums = [] for i in s: nums.append(ord(i)) # 2.列出所有三位数的水仙花数 narcissus_nums = [] for i in range(100,1000): i = str(i) if int(i[0])**3+int(i[1])**3+int(i[2])**3 == int(i): narcissus_nums.append(int(i)) # 3.回溯 def backtrack(ls,nums,stk): if sum(nums) in narcissus_nums: stk.append("".join(ls)) res.append(stk[:]) stk.pop() return for i in range(1,len(nums)): if sum(nums[:i]) in narcissus_nums: stk.append("".join(ls[:i])) backtrack(ls[i:],nums[i:],stk) stk.pop() res = [] # 只有满足条件的分组才会存入res backtrack(ls,nums,[]) # 4.输出 if len(res) == 0: # 分割不成功,res为空 print(0) elif len(res) == 1: # 分割唯一,输出子串数 print(len(res[0])
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。