整数 7. 整数反转 13.罗马数字转整数 12. 整数转罗马数字

7. 整数反转

思路1:使用字符串切片反转

代码实现1:

class Solution:
    def reverse(self, x: int) -> int:
        s = str(x)
        # 若x < 0,反转之后添加负号,否则直接反转
        s = '-' + s[:0:-1] if x < 0 else s[::-1]
		# 判断是否越界
        if -1 << 31 < int(s) < (1 << 31) - 1:
            return int(s)
        else:
            return 0

思路2:整数自身反转

代码实现2:

class Solution:
    def reverse(self, x: int) -> int:
        y = abs(x)
        rev = 0

        # 数值范围为[−2 ^ 31, 2 ^ 31 − 1],注意:减法运算符优先级高于位运算符,因此需要打括号
        boundary = (1 << 31) - 1 if x > 0 else 1 << 31

        while y != 0:
            rev = rev * 10 + y % 10
            if rev > boundary:
                return 0
            y = y // 10

        return rev if x > 0 else -rev

13. 罗马数字转整数

思路:

罗马数字转整数只有两种表示方式,要么一个字母转换为整数,要么两个字母合起来转换为整数。
使用一个队列来判断是否有组合字母:

  • 遍历罗马数字字符串:
    1. 当队列中没有元素时,往队列中push元素;
    2. 当队列中有一个元素时,先往队列中push一个元素,再判断这两个元素是否能组成组合字母:
      1. 若能组成组合字母,将对应的整数值做累加处理,清空队列;
      2. 若无法组成组合字母,将队首元素弹出,并在弹出时将对应的整数值做累加处理。
  • 最后可能会出现有一个元素留在队列中,因为s中倒数第二个字符和倒数第三个字符可能组成组合字母,因此需判断队列中是否有遗留元素,若是,将其弹出,并在弹出时将对应的整数值做累加处理。

代码实现:

class Solution:
    def romanToInt(self, s: str) -> int:
        ans = 0
        hash_map = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000,
                    'IV': 4, 'IX': 9, 'XL': 40, 'XC': 90, 'CD': 400, 'CM': 900}
        queue = []

        for c in s:
            if not queue:
                queue.append(c)
            else:
                queue.append(c)
                if queue[0] + queue[1] in hash_map:
                    ans += hash_map.get(queue[0] + queue[1])
                    queue.clear()
                else:
                    ans += hash_map.get(queue.pop(0))

        if queue:
            ans += hash_map.get(queue.pop(0))
        return ans

12. 整数转罗马数字

思路:贪心算法

1000以内的整数由13种罗马数字表示,给定一个整数,1.可以找到一个最大的罗马数字小于这个整数,2.我们将这个罗马数字添加进字符串,3.并将整数减去这个罗马数字对应的值,循环以上步骤,直到整数减为零,即完成转换。

代码实现:

class Solution:
    def intToRoman(self, num: int) -> str:
        nums = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]
        roman_str = ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I']
        ret_str = ''

        i = 0
        while i < len(nums) and num > 0:
            while num >= nums[i]:
                ret_str += roman_str[i]
                num -= nums[i]
            i += 1
        
        return ret_str
发布了51 篇原创文章 · 获赞 4 · 访问量 3512

猜你喜欢

转载自blog.csdn.net/yhhuang17/article/details/104999644