概念题
1.如果两个对象 a 和 b 的 id 值相同,那么 a is b 的运算结果就一定是 True,对吗?
对的。
解析:是(is)和不是(is not)被称之为同一性运算符,用于检测两个对象之间的 id 值是否相等。pL-e
动手题
1.给定字符串 s 和 t ,请编程判断 s 是否为 t 的子序列。
字符串的子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串(例如,"ace" 是 "abcde" 的子序列,而 "aec" 则不是)
s = input("请输入字符串s:")
t = input("请输入字符串t:")
n = len(s)
m = len(t)
j = k = 0
while j < n and k < m:
if s[j] == t[k]:
j += 1
k += 1
if j == n:
print("字符串 s 是字符串 t 的子序列。")
else:
print("字符串 s 不是字符串 t 的子序列。")
解析:
代码清单的解题思路是利用了 “双指针” 追踪的方法。Y
j 和 k 是两个负责追踪匹配的指针,分别指向字符串 s 和 t 的初始位置,然后每次判断 s[j] 与 t[k] 是否相等,如果相等则两个追踪指针同时移动到下一个位置继续判断。
由于 “子序列” 的判定是允许中间 “删除一些字符”,因此每当 s[j] 与 t[k] 不相等的时候,k 指针移动到下一位,继续尝试匹配。"O
最终如果 j 等于字符串 s 的长度,也就说明了 s 整个字符串成功地被遍历了一遍,即证明 s 是 t 的子序列。
2.给定一个字符串 s,请编程求出该字符串中的最大奇数。]i[_'w;?KV
举例
输入:43383
输出:43383
输入:5926
输出:59
输入:966
输出:9
s = "43383"
n = len(s)
for j in range(n-1, -1, -1):
if int(s[j]) % 2 == 1:
# 找到第一个值为奇数的字符,返回 s[0:j+1]
print(s[:j+1])
break
# 未找到值为奇数的字符,返回空字符串
else:
print(0)
解析:
首先,如果字符串 s 中不含有值为奇数的字符串,那么 s 的任何子字符串都不可能是奇数。nop6d
其实,我们需要考虑的是题目要求找出最大奇数。Vgyn[z8G
判断奇数的条件无非就是看最后一位是否为奇数,也就是说假如 s[j] 为奇数的话,那么所有以 s[j] 为结尾的子字符串必将都是奇数……3VBWwmx~t
因此,其中最大的奇数便是 s[:j+1](j 是下标,切片由于是“左闭右开”,所以需要 +1)