Leetcode简单编程每日一练(持续更新)

1、整数反转

要求: 123 —>321;-123—>-321;90—>9,如果不在-2147483648~2147483647之间则返回0。

方法一:
解题思路:
1、如果数字在[-9,9]之间,返回原数字
2、不在[-9,9]之间,判断是正数还是负数,
  1) 正数的话,将整数通过str()转换为字符串,通过列表的反转[::-1]进行反转,最后将字符串转为整形输出
  2) 是负数的话,通过[:0:-1]或者 [1:][::-1]进行反转,不包括符号位,然后将字符串转换为整形,再加上负号输出。

def reverse(x):
    if -10 < x <10:
        return x
    str_x = str(x)
    if str_x[0] != '-':
        str_x = str_x[::-1]
        x = int(str_x)
    else:
        str_x = str_x[:0:-1]
        x = int(str_x)
        x = -x
    return x if (-2**31) < x < (2**31-1) else 0

if __name__ == '__main__':
    x = int(input("请输入一个数: "))
    print("反转后的结果为:",reverse(x))

	

方法二:
解题思路:
1、对当前数循环取10的余数,再一步步添加到res的尾部,即可完成翻转
2、每次计算完成后计算翻转的数字是否在范围[−2 31, 231-1]内,否则返回0
3、注意:python的坑---- 由于Python的 // 操作是向下取整,导致正负数取余 % 操作结果不一致,因此需要将原数字转为正数操作。

class Solution:
    def reverse(self,x):
        y, res = abs(x), 0
        # (1<<31) -1:2147483647
        # (1<<31):21474843648
        # 如果x>0就跟2147483647比较大小
        # 如果x<0就跟2147483648比较大小
        # 比较大小时res是正数
        of = (1<<31) -1 if x > 0 else (1<<31)
        while y!= 0:
            res = res * 10 + y % 10
            if res > of  :
                return 0
            y //= 10
        return res if x > 0 else -res
if __name__ == '__main__':
    x= Solution()
    num = int(input('input a number:'))
    print('翻转的结果为: ', x.reverse(num))

(1<<31)表示1左移31位,使得符号位为1,其他位为0,再将左移后的结果减一就使得符号位为0,其他位都为1,即为int表示的有符号数的最大整数。
1 的二进制表示 0000 0000 0000 0000 0000 0000 0000 0001
左移31位得到  1000 0000 0000 0000 0000 0000 0000 0000
-1得到 0111 1111 1111 1111 1111 1111 1111 1111 此数为int(有符号)最大值。

2、回文数

方法一:暴力法
解题思路:将整数转换成字符串,查看逆序输出和正向输出是否相同

def isPalindrome(x: int) -> bool:
	str_x = str(x)
	# 直接判断逆序输出和正向输出是否相同
	return str_x == str_x[::-1]

方法二:pop方法
解题思路:1、0~9之间的数直接返回True
2、将整数(大于等于两位数的数)转换为字符串,判断去掉第一个元素和最后一个元素之后是否相等
负数的话去掉第一个元素之后成为正数,返回False
末尾为0的正整数去掉末尾,返回False

def isPalindrome(x: int) -> bool:
	lst = list(str(x))
	while len(lst) > 1:
		if lst.pop(0) != lst.pop()
			return False
	return True
	

方法三:反转一半判断前后是否相等
解题思路:
1、个位数直接返回True
2、多位数(>=2)判断是否小于0或最后一位是否为0,是返回False
3、反转一半输出

def isPalindrome(x: int) -> bool:
	if x < 0 or (x != 0 and x%10 == 0):
		return False
		
	if x == 0:
		return True
	else:
		reverse_x = 0
		while x > reverse_x:
			reverse_x = reverse_x*10 + x%10
			x //= 10
		
		return True if reverse_x == x or reverse_x//10 == x else False

3、罗马数字转整数
问题描述:
罗马数字包含以下七种字符: 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 到 3999 的范围内。

解题思路:
1、将字符和对应的数值以字典的形式存储起来
2、判断输入字符相邻两个字符的value的大小,if左小于右,减去左边字符对应的value值,如果左不小于右,加上左对应的value值,但这个过程无法加上输入字符的最后一个字符对应的value值
3、加上最后一个字符对应的value值

def romanToInt(self, s: str) -> int:
	d = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
	Int = 0
	# 1.依次遍历s的每一个元素(罗马数字)
	for index in range(len(s) - 1):
		# 判断相邻两个罗马数字的大小,左小于右,减去左
		if d[s[index]] < d[s[index] + 1]
			return Int -= d[s[index]]
		else:
			# 左大于右,加上左
			return Int += d[s[index]]
	# 前面的循环无法对最后一个元素进行比较,没有加上去,在这里将其加入
	return Int + d[s[-1]]

4、两数之和
题目描述:
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

解题思路:

方法1:
1、问题的关键点是抓住num2 = target - num1
2、如果num2在nums里,返回下标,在nums里找num2时,不是从每次从整个nums里面找,而是num1之前查找

def twonums(nums, target):
	j = -1
	for i range(1, len(nums)):
		temp = nums[:i]
		left_num = target - nums[i]
		if left_num in temp:
			j = temp.index(left_num)
			break
	if j > 0:
		return [j, i]

方法2:用字典模拟哈希求解(速度快)

def twonums(nums, target):
	d = {}
	for i in range(len(nums)):
		if (target - nums[i]) in d:
			return [d[target-num[i]], i]
		else:
			d[num[i]] = i

你可能感兴趣的:(编程题,纠错)