【数据结构与算法】之字符串系列-20240126

发布于:2024-01-26 ⋅ 阅读:(53) ⋅ 点赞:(0)

在这里插入图片描述


一、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)


在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看