例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII,即为 XX + V + II 。 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况: I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。 X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
1 2 3 4 5 6 7 8 9 10 11
defromanToInt(s): a = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000} ans = 0 for i in range(len(s)): if i<len(s)-1and a[s[i]] < a[s[i+1]]: # 处理特殊规则 ans -= a[s[i]] else: ans += a[s[i]] return ans
defaddBinary(a, b): r, p = '', 0 # 位数补齐 d = len(b) - len(a) a = '0' * d + a b = '0' * -d + b # 二进制运算 for i, j in zip(a[::-1], b[::-1]): s = int(i) + int(j) + p r = str(s % 2) + r p = s // 2 # 判断进位返回运算结果 return'1' + r if p else r
defaddStrings(a, b): r, p = '', 0 # 位数补齐 d = len(b) - len(a) a = '0' * d + a b = '0' * -d + b # 十进制运算 for i, j in zip(a[::-1], b[::-1]): s = int(i) + int(j) + p r = str(s % 10) + r p = s // 10 # 判断进位返回运算结果 return'1' + r if p else r
defread(buf, n): tmp = ["","","",""] cnt = 0 read4(tmp) while tmp != ["","","",""]: for i in range(4): if tmp[i]: buf[cnt] = tmp[i] cnt += 1 if cnt == n + 1: return n tmp = ["","","",""] read4(tmp) return cnt
defreverseVowels(s): seed = "aeiouAEIOU"# 元音中还有大小写之分 s = list(s) l, r = 0, len(s)-1 while l < r: if s[l] notin seed: l += 1 if s[r] notin seed: r -= 1 if s[l] in seed and s[r] in seed: s[l], s[r] = s[r], s[l] l += 1 r -= 1 return"".join(s)
defcanConstruct2(ransomNote, magazine): magazine_dict = {} # 哈希表存储magazine字符及个数 for c in magazine: if c in magazine_dict: magazine_dict[c] += 1 else: magazine_dict[c] = 1
for c in ransomNote: if c in magazine_dict and magazine_dict[c] > 0: magazine_dict[c] -= 1 else: returnFalse returnTrue
deffirstUniqChar1(s): # 计算字符出现次数 dic = {c: s.count(c) for c in set(s)} # 找到并返回首个满足出现次数为一的字符 for i, c in enumerate(s): if dic[c] == 1: return i return-1
deffirstUniqChar2(s): # 先定义一个最小索引, 默认值是最后的字符索引 min_unique_char_index = len(s) # 已知字符串由小写字母构成,则遍历a-z for c in"abcdefghijklmnopqrstuvwxyz": i = s.find(c) # 分别从目标的字符串头和字符串尾查找对应字母的索引;如果两索引相等,则说明是单一字符 if i != -1and i == s.rfind(c): # 更新最新的最小索引 min_unique_char_index = min(min_unique_char_index, i) return min_unique_char_index if min_unique_char_index != len(s) else-1
defdetectCapitalUse1(word): a = word b = word[1:] if a == a.upper() or a == a.lower(): returnTrue elif a[0] == a[0].upper() and b == b.lower(): returnTrue else: returnFalse
defdetectCapitalUse2(word): return word.isupper() or word.islower() or word.istitle()