用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& nums) {
next_permutation(nums.begin(), nums.end());
}
};

這個:

Remove Duplicates from Sorted Array | LeetCode OJ

class Solution {
public:
int removeDuplicates(vector& nums) {
return unique(nums.begin(), nums.end()) - nums.begin();
}
};

Rotate Array | LeetCode OJ

class Solution {
public:
void rotate(vector& nums, int k) {
std::rotate(nums.rbegin(), nums.rbegin() + k % nums.size(), nums.rend());
}
};

回到正題,雖然我沒用Python刷過題,但是我接觸過Python,我認為Python最大的特點就是簡潔,能用一行代碼完成的就絕不用兩行。Python的swap方法是我印象最深刻的:

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演算法嗎。?
學習機器學習深度學習之後,還需要掌握傳統演算法和數據結構嗎?

TAG:Python | 演算法 | 程序員面試 | 演算法與數據結構 | X是種怎樣的體驗 |