用Python刷面試演算法題(如leetcode)是怎樣的體驗?
Python簡潔的語言特性能否在刷題過程中如虎添翼?
記得有道最簡單的判斷輸入的數字中是否有重複的數字,然後寫了一行 return len(a) &> len(set(a)),然後過了……
以前還沒有run code功能時用py刷了一遍,不用ide,不調試,不運行,直接在編輯框寫完提交,倒也挺有樂趣,還能練白板寫碼能力。當時一百多題基本做完後正確率40%
總之不會因為用Py就沒法得到鍛煉。重要的是自律,每題盡量用自己會的最優的演算法,能常數空間就不要用線性空間,能線性時間就不要nlogn。其實如虎添翼的往往是那些個內置庫以及動態特性。
沒啥好說的,以前好玩的時候擼了兩百來題,對比用cpp的代碼,大都短很多。很多用生成器的實現會比較有意思,此外也可以琢磨琢磨怎麼寫得更pythonic,同時更高效。
考慮到leetcode的題目難度偏低,反倒突出了語言優勢。真說起來,演算法競賽之類的話難度其實並不在於幾個語法糖或者動態特性。但是若就面試題而言,Python功底如何,完全可以從這樣的題目的實現代碼里看出來。大概一些卡time比較緊的題可以用python手動增加難度(霧)
reverse string:
return input[::-1]然後就
....Python內置函數的確有時候會讓你如虎添翼,但是不太利益你對演算法的理解。更奇葩的是同樣的邏輯代碼,python編譯超時,java就立刻通過了。所以還是用java或者c刷題吧。我目前刷了68題,java白板寫起來還是很有意思的。 說個有趣的字元反轉s[::-1] 哈哈哈
方便是方便了很多 ,有時候一行代碼搞定了,不過運行速度方面就有待商榷了。
比如一道很簡單的字元串反轉的題目,Python的解法是
class Solution(object):
def reverseString(self, s):
"""
:type s: str
:rtype: str
"""
return s[::-1]
比如這一行代碼,在所有的Python提交的答案中的整體排名位置是
Python的整體速度方面,藍色部分表Python,低於大部分的C++、Java、C的提交答案。
其他回答也大致是如此,Python刷題的直觀感受就是使用起來很方便,這樣的方便有好處也有壞處,其實刷題的話還是不推薦使用Python的,當然如果你是需要去找一份Python相關的工作的話還是可以刷一刷的。
比如翻轉字元串那題,一句 return str[::-1]就好了
建議用C之類的,用Python最起碼不要直接調庫...
刷題嘛,越熟悉基礎的實現越好不然就沒有刷題的必要了,看看資料和手冊就行有很多題都是一行就解決了。。
應該說會比很多別的語言簡單很多。因為python提供了很強大的builtin功能,比如list、dict這類,而且不用考慮類型,超簡單。
另外,推薦一個刷題網站 http://www.lintcode.com
歪個題,我覺得其實C++的STL(特別是&)更簡潔。比如這個:
Next Permutation | LeetCode OJ
class Solution {
public:
void nextPermutation(vector&
next_permutation(nums.begin(), nums.end());
}
};
這個:
Remove Duplicates from Sorted Array | LeetCode OJclass Solution {
public:
int removeDuplicates(vector&
return unique(nums.begin(), nums.end()) - nums.begin();
}
};
Rotate Array | LeetCode OJ
class Solution {
public:
void rotate(vector&
std::rotate(nums.rbegin(), nums.rbegin() + k % nums.size(), nums.rend());
}
};
a,b = b,a
這是我在leetcode上的刷題記錄,全是python的
代碼地址:xsank/cabbird: A set of algorithms written in python.
python這麼語言用來刷題真的是非常的爽,她有非常靈活的語法糖和超易用的數據結構,用過的都說好!所以你可以看到很多problem用python來做代碼非常精簡,不過。。。
下面說兩點弊端:
1.對於位運算
python天生支持大數計算,會自動給你擴容而不會溢出,所以在很多位運算需要考慮補碼,移位等情況時會更麻煩
2.性能
這個性能真是體現的淋漓盡致,同樣的問題,用c++,java都可以ac,用python就tle了,你不得不降低時間複雜度,有的時候甚至還得動用一些hack的技術,比如將某些運算結果作為類屬性緩存起來。。。(是的,作為對象的屬性緩存都不行Orz...)
有一題是hamming distance,
Hamming Distance | LeetCode OJ
return bin(x^y).count("1")
然後過了。
之前用C++刷過一段時間,用了python直接飛起來了,再也不想用C++刷leetcode。
對於我而言,面試都是寫pesudo code,所以不用太擔心。
我認為知道解題的思路是最重要的,然後調用各種python的packages和containers來show your profession。
幾年前有公司面試時出了 一些試題。用python半小時做完。公司不滿意說只能用java.
我就直接GG 說你另請高明罷。
不好。python 某些簡潔的內置函數掩蓋了演算法複雜性
演算法學弱表示Python刷leetcode刷得我懷疑人生,就差沒生無可戀了。
python總會給你意想不到...
我還沒開始刷.
但是我開始溫習了一下演算法.
比如我寫快速排序:
def fast_sorted(nums):
if len(nums) == 1:
return nums
elif len(nums) == 2:
if nums[0] &> nums[1]:
nums = [nums[1], nums[0]]
return nums
else:
base = nums[0]
for rn, rk in enumerate(reversed(nums)):
rn = len(nums) - rn - 1
if rk &< base:
for ln, lk in enumerate(nums):
if ln == rn:
nums[0], nums[ln] = nums[ln], nums[0]
return fast_sorted(nums[:ln]) + [base] + fast_sorted(nums[ln + 1:])
elif ln &> 1 and lk &> base:
nums[ln], nums[rn] = rk, lk
break
else:
return [nums[0]] + fast_sorted(nums[1:])
return nums
沒什麼驚艷的,c也可以這樣,java也可以.
但是 , 我看到另一個版本
def fast_sorted(L):
if len(L) &< 2: return L
pivot_element = random.choice(L)
small = [i for i in L if i &< pivot_element]
medium = [i for i in L if i == pivot_element]
large = [i for i in L if i &> pivot_element]
return qsort(small) + medium + qsort(large)
很好,很python,今天可以睡個好覺了.
刷演算法題的原因,是因為,我發現我喜歡的女孩的某個(前)男友似乎很厲害.換句話說,我連某位前男友都比不上..
還有我的代碼,確實很爛.
慢是慢了一點,但是代碼幾乎可以直接照著偽代碼來,寫的時候感覺很輕鬆
每次寫完之後總會想想能不能更短點
推薦閱讀:
※做 IT,如何從優秀變為卓越?
※能幫助通俗解釋下NSGA3演算法嗎。?
※學習機器學習深度學習之後,還需要掌握傳統演算法和數據結構嗎?