一、12. 整数转罗马数字
中等
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 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:
输入: num = 3
输出: “III”
示例 2:
输入: num = 4
输出: “IV”
示例 3:
输入: num = 9
输出: “IX”
示例 4:
输入: num = 58
输出: “LVIII”
解释: L = 50, V = 5, III = 3.
示例 5:
输入: num = 1994
输出: “MCMXCIV”
解释: M = 1000, CM = 900, XC = 90, IV = 4.
class S12:
def func(self, num):
dic = [
(1000, 'M'),
(900, 'CM'),
(500, 'D'),
(400, 'CD'),
(100, 'C'),
(90, 'XC'),
(50, 'L'),
(40, 'XL'),
(10, 'X'),
(5, 'V'),
(4, 'IV'),
(1, 'I')
]
res = []
while True:
for i, j in dic:
if num >= i:
res.append(j)
num -= i
if num == 0:
break
return ''.join(res)
r = S12()
num = 1994
print(r.func(num))
二、43. 字符串相乘
中等
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。
示例 1:
输入: num1 = “2”, num2 = “3”
输出: “6”
示例 2:
输入: num1 = “123”, num2 = “456”
输出: “56088”
思路:123 * 456
= 3*6+3*50+3*400
+ 20*6+20*50+20*400
+ 100*6+100*50+100*400
class Solution:
def func(self, num1, num2):
ans = 0
f1 = 1
for i in range(len(num1) - 1, -1, -1):
n1 = int(num1[i]) * f1
f2 = 1
for j in range(len(num2) - 1, -1, -1):
n2 = int(num2[j]) * f2
ans += n1 * n2
f2 *= 10
f1 *= 10
return str(ans)
三、49. 字母异位词分组
中等
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]
示例 2:
输入: strs = [“”]
输出: [[“”]]
示例 3:
输入: strs = [“a”]
输出: [[“a”]]
def func(strs):
d=defaultdict(list)
for item in strs:
key=''.join(sorted(item))
d[key].append(item)
return list(d.values())
strs=["eat", "tea", "tan", "ate", "nat", "bat"]
print(func(strs))
四、151. 反转字符串中的单词
中等
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例 1:
输入:s = “the sky is blue”
输出:“blue is sky the”
示例 2:
输入:s = " hello world "
输出:“world hello”
解释:反转后的字符串中不能存在前导空格和尾随空格。
示例 3:
输入:s = “a good example”
输出:“example good a”
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。
class S151:
def func(self, s):
return ' '.join(s.split()[::-1])
r = S151()
s = "a good example"
print(r.func(s))
五、179. 最大数
中等
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
示例 1:
输入:nums = [10,2]
输出:“210”
示例 2:
输入:nums = [3,30,34,5,9]
输出:“9534330”
def fn(nums):
#todo 1先根据首位排序
s = list(map(str, nums)) #利用map映射函数
print(s) #['3', '30', '34', '5', '9']
ordered = sorted(s, key=lambda x: x, reverse=True) #通过sorted降序排序
print(ordered) #['9', '5', '34', '30', '3']
#todo 2、首位相同的,进行二次排序
for i in range(len(ordered) - 1):
#todo 如果相邻两个字符的首字符相同,
if ordered[i][0] == ordered[i + 1][0]:
# todo 判断当前字符的末尾与下一个字符的首位进行比较,
#todo 如果当前字符的末位小于下一个字符的首位,则进行交换位置
if int(ordered[i][-1]) < int(ordered[i + 1][0]):
ordered[i], ordered[i + 1] = ordered[i + 1], ordered[i]
return ''.join(ordered)
nums = [10,2]
res=fn(nums)
print(res)