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. 罗马数字转整数
思路:
罗马数字转整数只有两种表示方式,要么一个字母转换为整数,要么两个字母合起来转换为整数。
使用一个队列来判断是否有组合字母:
- 遍历罗马数字字符串:
- 当队列中没有元素时,往队列中push元素;
- 当队列中有一个元素时,先往队列中push一个元素,再判断这两个元素是否能组成组合字母:
- 若能组成组合字母,将对应的整数值做累加处理,清空队列;
- 若无法组成组合字母,将队首元素弹出,并在弹出时将对应的整数值做累加处理。
- 最后可能会出现有一个元素留在队列中,因为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