• 整数转罗马数字


    题目:罗马数字 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 的范围内。
    来源:https://leetcode-cn.com/problems/integer-to-roman/

    法一:自己的代码

    思路:第一步先把数字变为字符串并拆分成一个一个的数字,第二步再求出原数字的分解形式,第三步利用字典映射分别求出每个数字对应的字符串,最后再相加

    class Solution:
        def intToRoman(self, num: int) -> str:
            def zhuhe(q, dict):
                # 取最高位的数字
                high_num = int([i for i in str(q)][0])
                # 当最高位是0时,乘以一个字符串返回是空
                if high_num < 4:
                    return dict['a'] * high_num
                elif high_num == 4:
                    return dict['a'] + dict['b']
                elif high_num == 5:
                    return dict['b']
                elif high_num == 6:
                    return dict['b'] + dict['a']
                elif high_num == 7:
                    return dict['b'] + dict['a'] * 2
                elif high_num == 8:
                    return dict['b'] + dict['a'] * 3
                elif high_num == 9:
                    return dict['a'] + dict['c']
                else:
                    return dict['c']
            # 对四种情况分别定义不同的映射字典
            # 注意这里的p表示的是个位十位还是百位
            def dict_map(p,q):
                if p == 0:
                    dict = {'a':'I', 'b':'V', 'c':'X'}
                elif p == 1:
                    dict = {'a':'X', 'b':'L', 'c':'C'}
                elif p == 2:
                    dict = {'a':'C', 'b':'D', 'c':'M'}
                else:
                    dict = {'a':'M'}
                return zhuhe(q,dict)
            # 利用for循环把字符串拆分开
            num_list = [i for i in str(num)]
            # 把list中的字符转化为数字
            num_list = list(map(int, num_list))
            # 利用for循环把原数字拆分为几个数字的和
            all_num = []
            for i in range(len(num_list)):
                a = num_list[i] * 10**(len(num_list)-1-i)
                all_num.append(a)
            # 分别对每个数字求其对应的字符串
            # 必须是空,不能赋None
            num_str = ''
            for p,q in enumerate(reversed(all_num)):
                # 注意这里要把字符串加到右边
                num_str = dict_map(p, q) + num_str
            return num_str
    if __name__ == '__main__':
        duixiang = Solution()
        ww = duixiang.intToRoman(2005)
        print('结果是:', ww)
    View Code

     法二:贪心算法

    思路:观察出了2,3,6,7,8数字都是由1,5组合得来的,其组合的原理即贪心算法,先取大的,对于特殊的4,9直接处理

    参考:https://leetcode-cn.com/problems/integer-to-roman/solution/tan-xin-suan-fa-by-liweiwei1419/

    class Solution:
        def intToRoman(self, num: int) -> str:
            # 把阿拉伯数字与罗马数字可能出现的所有情况和对应关系,放在两个数组中
            # 并且按照阿拉伯数字的大小降序排列,这是贪心选择思想
            nums = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]
            romans = ["M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"]
    
            index = 0
            res = ''
            while index < 13:
                # 注意:这里是等于号,表示尽量使用大的"面值"
                while num >= nums[index]:
                    res += romans[index]
                    num -= nums[index]
                index += 1
            return res
    View Code
  • 相关阅读:
    python中的 if __name__ == “__main__”: 有什么用
    LeetCode Two Sum 解题思路(python)
    numpy cheat sheet
    matlab中换行
    从github下载一个单一文件
    tensorflow轮子下载地址 wheels(whl)
    tensorflow报错 Key Conv/biases not found in checkpoint
    tensorflow报错 tensorflow Resource exhausted: OOM when allocating tensor with shape
    西门子 1500 1200 PLC,位访问, 字节访问
    查看pip install安装的python包的位置
  • 原文地址:https://www.cnblogs.com/xxswkl/p/11742371.html
Copyright © 2020-2023  润新知