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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章