LeetCode-python-自己and大神的解題思路(一)
由於剛開始練習,所以比較菜。python學了感覺跟沒學一樣,所以想找些題來練習練習。日後將會不斷的更新,如果哪位大神有更好的思路可以在評論區留言。
1. 兩數之和
解題思路:由於剛開始,演算法知道的比較少,所以就想來分享一下大神們的思路,20個案例用時40ms。他的思路是這樣的:建立一個用來存放檢查的字典,用target去逐個減去nums列表裡的值,將這些差值存入字典,然後遍歷列表nums,如果之後遇到的數字有和字典中的值一樣,那麼輸出字典中之所對應的key(被減數的索引)和當前數的索引。
程式碼如下
class Solution: def twoSum(self, nums, target): """ :type nums: List[int] :type target: int :rtype: List[int] """ check={} for i in range(len(nums)): if nums[i] in check: return [check[nums[i]],i] else: check[target-nums[i]]=i
2. 兩數相加
解題思路:之前沒有怎麼學過連結串列,對連結串列不是很懂,在查閱了一些資料之後,稍微有些理解了。如果有說的不對的地方歡迎糾正指導。首先要知道單鏈表由兩部分組成:元素和指標,元素是用來存放資料的,指標是用來存放下一個節點元素的地址。
兩數相加就意味著兩個連結串列對應節點的元素值相加。在程式碼前五行就定義了一個連結串列,self.val為元素的值,self.next為指標。在寫程式碼的過程中要注意設一個負責進位的變數。具體的程式碼流程我在程式碼中加具體的註釋。
程式碼如下
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def addTwoNumbers(self, l1, l2): """ :type l1: ListNode :type l2: ListNode :rtype: ListNode """ #先初始化temp連結串列,l3連結串列指向temp的0值地址 temp = ListNode(0) l3 = temp a = 0 #進位的數字 #當l1不為空或者l2不為空或者a不等於0的時候 while l1 != None or l2 !=None or a != 0: if l1 != None: #a等於a加上l1當前的值 a += l1.val #l1的指標指向下一個元素,下次呼叫l1.val就是下一個元素的值 l1 = l1.next if l2 != None: a += l2.val #把l2和l1相應節點的值相加賦給a l2 = l2.next #temp的下一個的值就是 a%10 temp.next = ListNode(a%10) temp = temp.next a=a//10 #l3代替temp來輸出連結串列 return l3.next
另外一種寫法的程式碼
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def addTwoNumbers(self, l1, l2): """ :type l1: ListNode :type l2: ListNode :rtype: ListNode """ # 如果有一個連結串列為空,返回另外一個 if l1 is None: return l2 if l2 is None: return l1 # tmp是暫存(temporal) tmp = ListNode(0) # 引用ListNode類定義了一個連結串列節點並賦給tmp # res是重置(reset) res = tmp # 賦值 # flag 標示 flag = 0 # 初始化 while l1 or l2: # l1或l2不為空就持續執行 tmp_sum = 0 # 連結串列節點值的和 if l1: # 如果l1不為空,把l1的某個節點值的和賦給tmp_sum tmp_sum = l1.val # 把l1的某個節點的值賦給tmp_sum l1 = l1.next if l2: # 如果l2不為空,把l2中和l1對應的節點的值加到tmp_sum tmp_sum += l2.val l2 = l2.next # 指向下一個節點,為下一次的加和做準備 tmp_res = ((tmp_sum + flag) % 10) # 個位數字 flag = ((tmp_sum + flag) // 10) # 進位的數 res.next = ListNode(tmp_res) res = res.next # res後移 if flag: # 如果flag不為0,就是對應位置相加後有進位 res.next = ListNode(1) # res的下一節點設為1 res = tmp.next # 賦值 del tmp # 刪除tmp變數 return res # 返回res連結串列
7.反轉整數
自己的解題思路:首先將輸入的有符整數轉換為字串,然後進行判斷,正數直接反轉,負數去除符號後進行反轉,最後將反轉後的字串轉換為整數進行輸出,在返回的時候加一個判斷數字範圍的條件。大神的解題思路和我們的差不多,不過他的程式碼更為簡便。
自己程式碼如下
class Solution:
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
str_x = str(x)
if '-' in str_x:
flip = str_x[1:][::-1]
result = -int(flip)
else:
flip = str_x[::-1]
result = int(flip)
return result if -2147483648 < result < 2147483647 else 0
大神程式碼如下
class Solution:
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
flag = 0
if x > 0:
flag = 1
else:
flag = -1
s = str(abs(x))[::-1]
n = int(s) * flag
return n if n.bit_length() < 32 else 0
8. 字串轉整數 (atoi)
這個程式碼調的我真的要吐了,由於自己的邏輯性不好,所以調了有六七次才通過。希望自己以後在考慮問題的時候邏輯性強一些,考慮問題全一些。
解題思路:按照題目的要求一步一步來,先移除字串句首的空格,如果句首如果為+或者-,那麼就從字串的第二個字元開始後續工作,如果為空字元就返回0,然後逐位進行遍歷判斷,是數字就保留,不是數字就截止,最後進行判斷,空字元返回0,是數字進行返回並進行範圍考慮。
程式碼如下:
class Solution:
def myAtoi(self, str):
"""
:type str: str
:rtype: int
"""
str = str.strip()
if not str:
return 0
num = ['0','1','2','3','4','5','6','7','8','9',]
flag = 1
if (str[0] == '-'):
str = str[1:]
flag= -1
elif(str[0] == '+'):
str = str[1:]
for x in range(len(str)):
if str[x] not in num:
str = str[0:x]
break
if str == '':
return 0
result = int(str)*flag
if result < -2**31:
return -2**31
elif result > 2**31-1:
return 2**31-1
else:
return result
直接上前幾名的程式碼,思路也非常明確。直接從字串開始一位一位判斷,不去轉換為整數。
class Solution:
def myAtoi(self, str):
"""
:type str: str
:rtype: int
"""
if (str == ""):
return 0
res = ''
index = 0
while index < len(str) and str[index] == ' ':
index += 1
if index < len(str) and str[index] in '-+':
res += str[index]
index += 1
while index < len(str) and str[index] in '0123456789':
res += str[index]
index += 1
if (res == '' or res == '+' or res == '-'):
return 0
if (int(res) > 2**31 - 1):
return 2**31 - 1
elif (int(res) < -2**31):
return -2**31
else:
return int(res)
class Solution:
def myAtoi(self, str):
"""
:type str: str
:rtype: int
"""
import re
res = re.findall(r"^[\+\-]?\d+",str.strip())
print(res)
if res !=[]:
if int(res[0]) > (2**31-1):
return (2**31-1)
if int(res[0]) < (-2**31):
return (-2**31)
return int(res[0])
else:
return 0
9. 迴文數
解題思路:這道題有兩種解法。1、常規的解法就是將輸入的整形數轉換為字串,再將字串進行反轉,之後與原數進行判斷。2、第二種方法是採用數學的方法。方法為逐次整除,將餘數提取出來帶入,重新組建數字,不斷乘以10去加上新算出的餘數,如果是迴文數字,那麼新組建的數字就和輸入的一樣。
注意:python中" / "就表示 浮點數除法,返回浮點結果;" // "表示整數除法
方法一程式碼如下
class Solution:
def isPalindrome(self, x):
"""
:type x: int
:rtype: bool
"""
x = str(x)
x1 = x[::-1]
if x == x1 :
return True
else:
return False
方法二程式碼
class Solution:
def isPalindrome(self, x):
"""
:type x: int
:rtype: bool
"""
if x > 0:
n,newed = 0,0
n = x
while x > 0:
newed = newed *10 + x % 10
x = x//10
if newed == n:
return True
else:
return False
elif x == 0:
return True
elif x < 0:
return False
看了第一名的程式碼不得不佩服是大佬,請欣賞大佬的表演
class Solution:
def isPalindrome(self, x):
"""
:type x: int
:rtype: bool
"""
if x < 0:
return False
else:
return int(str(x)[::-1]) == x
13、羅馬數字轉整數
解題思路:首先要讀懂題目,對於羅馬這7個字元要熟悉,應該要想到使用字典去構建這個羅馬數字轉字元的儲存,接著去讀懂羅馬數字規則,前面這個數字比後面數字大就正常加上這個數字本身值,如果小的話就用後面這個數字減去前面這個數字的值。初步的想法就是去遍歷每一個字元,與其後面的字元比較,將結果加入總和中,最後存在一個問題,最後一個數字沒有辦法加上,在返回值中加入最後一個數字在比如IV這樣的案例中會重複計算。所以轉換一下想法,在總和的基礎上只添加當前這個數字,比後面大的話為+號,比後面小的話為-號。
我的程式碼如下:
class Solution:
def romanToInt(self, s):
"""
:type s: str
:rtype: int
"""
sum = 0
convert = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
for i in range(len(s)-1):
if convert[s[i]] >= convert[s[i+1]]:
sum = sum + convert[s[i]]
else:
sum = sum - convert[s[i]]
return sum+convert[s[-1]]
這種方法耗時太長,將sum = sum - convert[s[i]]寫為sum -= convert[s[i]]會節約一些時間,我看用時比較快的人寫法是將可能出現的情況都列入字典中,減少了計算的過程,然後從輸入的字元中從前往後遍歷。遍歷的過程中分為兩種情況,一種兩個字元,一種一個字元,然後在字典中尋找相應的值相加。程式碼如下
class Solution:
def romanToInt(self, s):
"""
:type s: str
:rtype: int
"""
convert = {"I":1,"IV":4,"V":5,"IX":9,"X":10,"XL":40,"L":50,"XC":90,"C":100,"CD":400,"D":500,"CM":900,"M":1000}
len_n = len(s)
n = 0
i = 0
while(i < len_n):
key = s[i:i+2]
if key in convert:
n+=convert[key]
i+=2
continue
key = s[i]
if key in convert:
n+=convert[key]
i+=1
return n
相關推薦
LeetCode-python-自己and大神的解題思路(一)
由於剛開始練習,所以比較菜。python學了感覺跟沒學一樣,所以想找些題來練習練習。日後將會不斷的更新,如果哪位大神有更好的思路可以在評論區留言。 1. 兩數之和 解題思路:由於剛開始,演算法知道的比較少,所以就想來分享一下大神們的思路,20個案例用時40ms。他
【LeetCode】212. Word Search II 解題報告(C++)
作者: 負雪明燭 id: fuxuemingzhu 個人部落格: http://fuxuemingzhu.cn/ 目錄 題目描述 題目大意 解題方法 字首樹 日期 題
python簡單爬蟲:爬取並統計自己部落格頁面的資訊(一)
1. 什麼是爬蟲 也叫網路爬蟲,簡單來說,爬蟲就是從一個根網站出發,根據某種規則獲得更多的相關網站的url,自動下載這些網頁並自動解析這些網頁的內容,從中獲取需要的資料。例如爬取某種圖片、某類文字資訊等。爬蟲還可以用於編纂搜尋引擎的網路索引。 爬蟲所涉及的知
最大熵學習筆記(一)預備知識
color wrap targe dsm entropy plus 文件 eight 相關鏈接 生活中我們常常聽到人們說“不要把雞蛋放到一個籃子裏”。這樣能夠減少風險。深究一下,這是為什麽呢?事實上,這裏邊包括了所謂的最大熵原理(The Maxim
在Python中用Request庫模擬登錄(一):字幕庫(無加密,無驗證碼)
用戶名 com color 了無 1-1 value img requests log 如此簡單(不安全)的登錄表單已經不多見了。字幕庫的登錄表單如下所示,其中省去了無關緊要的內容: 1 <form class="login-form" action="/User/
Python不歸路_裝飾器(一)
意思 地址 函數返回值 right 輸出結果 運用 logs pan ext 裝飾器 裝飾器 什麽是裝飾器?給現有函數添加新功能的函數,不更改現有函數源代碼,現有函數調用方式。裝飾器是由高階函數和嵌套函數組成。 概括上面這句話的意思:1、裝飾器 - - - >
自己搭建自動化巡檢系統(一) 環境準備系統連接gns3
自動化 巡檢 這系列的博文,講述一個自制的自動巡檢系統,僅僅是在cisco設備中運行,之後會基於這個思路,寫出一個兼容性的通用巡檢系統,傳統網工對網絡設備是非常熟悉的,然而在編程開發這一塊是相對弱勢一點。我在想在SDN的背景下,網工一旦會編程,該有多麽強勢,一些重復執行的步驟,電腦代勞,
python 基礎 2.1 if 流程控制(一)
字符串 ace 冒號 rip inpu root 類型 真的 use 一.if else 1.if 語句 if expression: //註意if後有冒號,必須有 statement(s) //相對於if縮進4個空格 註:python
python-接口開發flask模塊(一)工具類準備
update date lose code def let mit pip clas 我們常常聽說測試http接口、測試java接口,測試socket接口等等;那麽python這麽強大的語言當然也可以用來開發接口了。 flask模塊介紹: python中用來開發接口的模塊:
Appium+python移動端自動化測試-環境搭建(一)
過程 .com oid pytho 安裝環境 測試 ID alt ppi 搭建所在系統環境:Windows7版本64位系統 一、環境準備 jdk8.0.151 android-sdk_r20.3.4-windows python3.5 appium1.4.16
python之路:用戶輸入(一)
老師 用法 inf 代碼 用戶輸入 display 用戶 -- class python之路:用戶輸入(一) 好了,現在我學了點博客的用法,現在不會像以前的那麽土了。好吧,不多說,我要講課了。 今天,我會用情景實例給大家說這個用戶輸入。 情景是:你是IT教育的python帶
用Python預測某某國際平臺概率分析(一):這個到底是什麽,是什麽樣的規則?
.... pan 又是 參與 其中 其他 nbsp 中國古代 合計 這個到底是什麽? 想必大家都玩過體彩,福彩,甚至6禾踩(懂了就行),以隨機的方式依次羅列出6個(或者7個,或者8個)的數字的集合,參與者可根據已經預訂的數字進行匹配,匹配正確3個以上是什麽什麽樣的獎勵,匹
Python C AP的使用詳解(一)
nds 項目 namespace 以及 int float 數據大小 mem else 簡介 介紹一下Python虛擬機的初始化及退出,Python基本數據類型的對象創建以及C和Python之間的數據類型互相轉換。 Python虛擬機的初始化及退出 初始化Python虛擬機
python之pandas簡單介紹及使用(一)
dad all 就會 能夠 簡單的 兩種 first 模型 自己 python之pandas簡單介紹及使用(一) 一、 Pandas簡介1、Python Data Analysis Library 或 pandas 是基於NumPy 的一種工具,該工具是為了解決數據分析任
Python 字符串內置方法(一)
bcd 成功 對齊 code () dsw out 設置 匹配 以下方法只需要知道用法就行了,權當了解,不用硬背,以後需要用到的時候再回來看 說明: 一般方法中前面是is開頭的就是判斷來的,輸出不是True就是False,例如isalpha()方法 capitalize
演算法分析初步-最大連續和問題(一)
程式設計者都希望自己的演算法高效,但演算法在寫成程式之前是執行不了的,難道每設計出一個演算法都必須寫出程式才能知道快不快嗎?答案是否定的。本節介紹演算法分析的基本概念和方法,力求在程式設計之前儘量準確地估計程式的時空開銷,並作出決策-例如,如果演算法又複雜速度又慢,就不要急著寫出來了。 給出
大資料之Spark(一)--- Spark簡介,模組,安裝,使用,一句話實現WorldCount,API,scala程式設計,提交作業到spark叢集,指令碼分析
一、Spark簡介 ---------------------------------------------------------- 1.快如閃電的叢集計算 2.大規模快速通用的計算引擎 3.速度: 比hadoop 100x,磁碟計算快10x 4.使用: java
大資料之scala(一) --- 安裝scala,簡單語法介紹,條件表示式,輸入和輸出,迴圈,函式,過程,lazy ,異常,陣列
一、安裝和執行Scala解釋程式 --------------------------------------------- 1.下載scala-2.11.7.msi 2.管理員執行--安裝 3.進入scala/bin,找到scala.bat,管理員執行,進入scala命
Python地理位置資訊庫geopy的使用(一):基本使用
geopy是Python關於地理位置的一個第三方庫,用這個庫來進行地址位置資訊的查詢和轉換非常方便,本文介紹關於geopy的常用的幾種用法 geopy的安裝 pip install geopy 根據地址查詢座標及詳細資訊 >>> import json, logging &
寫一個屬於自己的PHP的MVC框架(一)
最近想做個PHP的個人部落格作為學習用,但是發現儘管把PHP函式用得很熟悉了,按照常規的辦法,寫一個頁面處理一個請求,僅僅一個部落格就可能有很多個頁面,而且php程式碼和html程式碼都結合的非常緊密,如果想要實現更換面板的功能,就顯得非常無力。在網上找了好多framework框架,但似乎又要開始學