最近在看leetcode,並且正在上面刷一些簡單級別的題目(不過說真的,這些題真的簡單嗎??或許是我太菜,有些感覺也很難)
本篇記錄5道題的解題思路,可能都是最笨的方法
題目描述:
實現一個算法,確定一個字符串 s 的所有字符是否全都不同
示例 1:
輸入: s = "leetcode"
輸出: false
示例 2:
輸入: s = "abc"
輸出: true
限制:
0 <= len(s) <= 100
原題連結:
https://leetcode-cn.com/problems/is-unique-lcci/
解決思路:
python中有一個內置函數set(),它的一個特性就是->可以利用已有列表、字符串、元組或字典的內容來創建集合,其中重複的值會被丟棄;所以就可以通過set()來得到一個剔除重複值後的集合,並且比較兩者的長度,如果長度相等,則證明字符唯一;如果長度不等,則字符不唯一代碼如下:
class Solution(object):
def isUnique(self, astr): """ :type astr: str :rtype: bool """ len_1 = len(astr) b = set(astr) len_2 = len(b) if len_1 == len_2: print("true") return True else: print("false") return False題目描述:
給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和為目標值的那 兩個 整數,並返回他們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素不能使用兩遍。
示例: 給定 nums = [2, 7, 11, 15], target = 9 因為 nums[0] + nums[1] = 2 + 7 = 9原題連結:
https://leetcode-cn.com/problems/two-sum/
解決思路:
用第1個數字依次與其後面的數字相加,判斷結果是否為目標值;然後用第2個數字依次與其後面數字相加,判斷結果是否為目標值; 依此類推,用第n個數,與其後的數字相加,這樣就做到了任意2個數字(不重複)的疊加求和代碼如下:
class Solution(object): def twoSum(self, nums, target): """ 思路:用第1個數字依次與其後面的數字相加,判斷結果是否為目標值;然後用第2個數字依次與其後面數字相加,判斷結果是否為目標值 依次類推,用第n個數,與其後的數字相加,這樣就做到了任意2個數字的不重複疊加求和 :type nums: List[int] :type target: int :rtype: List[int] """ for i in range(0, len(nums)): for j in range(i + 1, len(nums)): if nums[i] + nums[j] == target: return i, j else: continue題目描述:
判斷一個整數是否是迴文數。
迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。
示例 1:
輸入: 121
輸出: true
示例 2:
輸入: -121
輸出: false
解釋: 從左向右讀, 為 -121 。從右向左讀, 為 121- 。因此它不是一個迴文數。
示例 3:
輸入: 10
輸出: false
解釋: 從右向左讀, 為 01 。因此它不是一個迴文數。
進階:
你能不將整數轉為字符串來解決這個問題嗎?
原題連結:
https://leetcode-cn.com/problems/palindrome-number/
解決思路:
把輸入的數字先轉換成列表,反向取出來,也就是從最後一個開始提取,然後依次追加到一個新的列表並組合成一個新的字符串,代碼如下:
class Solution(object): def isPalindrome(self, x): """ 解決思路:把輸入字符串轉換成列表,反向取出來,也就是從最後一個開始提取,然後依次追加到一個新的列表並組合成一個新的字符串,然後與原字符串判斷是否相等 :type x: int :rtype: bool """
string = str(x) s_list = list(string) n_list = [] for t in range(0, len(s_list)): n_list.append(s_list[len(s_list)-t-1])
n_string = "".join(n_list)
if string == n_string: return True else: return False另一種寫法更簡單些,把輸入數字轉換成字符串後,直接通過切片的方法,反向輸出得到一個新的字符串def isPalindrome_2(self, x): string = str(x) new_string = string[::-1]
if string == new_string: return True else: return False題目描述:
給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。
假設我們的環境只能存儲得下 32 位的有符號整數,則其數值範圍為 [−231, 231 − 1]。請根據這個假設,如果反轉後整數溢出那麼就返回 0原題連結:
https://leetcode-cn.com/problems/reverse-integer/
解決思路:
先把整數轉換為字符串,然後利用字符串切片的方法將其進行反轉(注意:如果傳入的是負數,需要保留"-"前綴,只將後面的字符反轉)
代碼如下:
class Solution(object):
def reverse(self, x): """
:type x: int :rtype: int """ l = str(x) if l[0] == "-": s = l[1:] new = s[::-1] i = "" for t in new: i += t i = "-" + i else: new = l[::-1]
i = "" for t in new: i += t
if -2 ** 31 <= int(i) <= 2 ** 31 - 1: return int(i) else: return 0題目描述:
輸入: ["flower","flow","flight"]輸入: ["dog","racecar","car"]原題連結:
https://leetcode-cn.com/problems/longest-common-prefix/
解決思路:
這個把我難住了,後來看了官方題解,裡面有一個橫向掃描法和一個縱向掃描法,下面根據自己的理解來實現了一下
代碼如下:
橫向掃描法
class Solution(object): def longestCommonPrefix(self, strs): """ 橫向掃描法 :type strs: List[str] :rtype: str """ if not strs: return "" else: prefix = strs[0] length = len(strs)
for t in range(1, length): prefix = self.common_start(prefix, strs[t]) if not prefix: break return prefix
@staticmethod def common_start(str1, str2): """ 獲取2個字符的公共前綴 :param str1: :param str2: :return: """ length = min(len(str1), len(str2))
if length == 0: return ""
else: common = "" for i in range(0, length):
common += str1[i]
if str2.startswith(common): continue
else: return common[:-1] return common
縱向掃描法
class Solution(object): @staticmethod def longestCommonPrefix2(strs): """ 縱向掃描法 :param strs: :return: """ if not strs: return ""
for i in range(0, len(strs[0])):
c = strs[0][i]
for j in range(1, len(strs)):
if i <= len(strs[j])-1:
if strs[j][i] == c:
pass else: print("第1個return") return strs[0][:i] else: print("第2個return") return strs[0][:i] print("第3個return") return strs[0]喜歡記得來一個