為什麼10.24程序員節,我卻需要加班?

1024程序員節

為什麼10.24程序員節,我卻需要加班?

10.24程序員節

今天是1024程序猿/媛的節日,本來聽起來不錯,可是想到明天項目轉測,估計又不知道要加班到幾點就覺得心塞….為什麼明明是程序員的節日,自己卻要加班!

是因為我沒有穿格子衫?

為什麼10.24程序員節,我卻需要加班?

程序員穿搭標配

或是我的髮際線不達標?

為什麼10.24程序員節,我卻需要加班?

程序員髮際線

歸根結底,還是自身技術不過關,頂多算是個搬磚的

為什麼10.24程序員節,我卻需要加班?

專業搬磚三十年

CTRL+C & CTRL+V

經常遇到來面試的人員,問到為什麼從上家公司離職,回答的無外乎薪資問題、感覺在公司沒有提升空間、想找個更好的發展平臺,等等…但大家是否想過,每天CTRL+C & CTRL+V的工作心態與if else 的編程思路,是公司沒有給你提升的空間,還是自己不想著自我提升呢?

為什麼10.24程序員節,我卻需要加班?

細思恐極

一道簡單習題引發的思考

今天無意間看到一道python習題,題目是這樣的:

有一個長度在1-10000之間的數字列表,它們通過逗號分隔,其中涵蓋了0-1000的重複數字,比如1,4,3,5,3,5,4,該列表中有且僅有一個數字出現了奇數次,請通過代碼獲得該列表中,那個出現奇數次的數字。

常規解法

打眼一看這道題,感覺很無腦,無非是列表轉集合,然後for循環集合中的數字,通過count進行計算就OK了麼,代碼如下:

 1# -*- coding: utf-8 -*- 
2# @Author : 王翔
3# @WeChat : King_Uranus
4# @公眾號 : 清風Python
5# @GitHub : https://github.com/BreezePython
6# @Date : 2019/10/24 0:01
7# @Software : PyCharm
8# @version :Python 3.7.3
9# @File : 常規解法.py
10
11def func():
12 case_list = input("請輸入用例列表:").strip().split(',')
13 case_set = set(case_list)
14 for num in case_set:
15 if case_list.count(num) % 2:

16 print("找到符合要求的數字: {}".format(num))
17 break
18 else:
19 print("未找到符合要求的數字")
20
21if __name__ == '__main__':
22 func()

for else確實是python中比較特殊的一個語法結構,如果for循環正常執行結束,則執行else內的語句。但程序說的很清楚列表中有且僅有一個數字出現了奇數次,完全沒有必要畫蛇添足。

強行顯擺解法

大家都知道,如果面試的時候,你能將題目通過多種方式實現,那麼肯定會得到更高的認可對,然後有了下面的強行裝13解法:

 1# -*- coding: utf-8 -*- 
2# @Author : 王翔
3# @WeChat : King_Uranus
4# @公眾號 : 清風Python
5# @GitHub : https://github.com/BreezePython
6# @Date : 2019/10/24 0:10
7# @Software : PyCharm
8# @version :Python 3.7.3
9# @File : 2.groupby函數.py
10
11from itertools import groupby
12
13def func():
14 case_list = input("請輸入用例列表:").strip().split(',')
15 list_group = groupby(case_list)
16 for k, v in list_group:

17 if len(list(v)) % 2:
18 print("找到符合要求的數字: {}".format(k))
19 break
20
21if __name__ == '__main__':
22 func()

itertools的groupby在日常中使用的比較少。groupby聚合函數與日常使用的sql等聚合方式一致,最終生成key:value的鍵值對,value為迭代對象。

更為簡潔的Counter

python中collections模塊附帶有一個Counter的函數,使用它能讓我們裝13時,顯得沒有上面那麼僵硬:

 1# -*- coding: utf-8 -*- 
2# @Author : 王翔
3# @WeChat : King_Uranus
4# @公眾號 : 清風Python
5# @GitHub : https://github.com/BreezePython
6# @Date : 2019/10/24 0:58
7# @Software : PyCharm
8# @version :Python 3.7.3
9# @File : 3.Counter函數.py
10
11from collections import Counter
12
13def func():
14 case_list = input("請輸入用例列表:").strip().split(',')
15 print(Counter(case_list))
16 for k, v in Counter(case_list):
17 if v % 2:
18 print("找到符合要求的數字: {}".format(k))
19 break
20
21if __name__ == '__main__':
22 func()

裝X翻車現場

本來這道題到這裡該結束了,但仔細想想,還有什麼方式可以用來統計元素數量的奇偶性呢?不管是python還是java等其他編程語言,都存在一個異或的操作,是否可以使用它來實現。

1^3^1 = 3

然後想當然的,我就寫出了下面的代碼:

1from functools import reduce 
2
3def func():
4 case_list = map(int, input("請輸入用例列表:").strip().split(','))
5 print(reduce(lambda x, y: x ^ y, case_list))
6
7if __name__ == '__main__':
8 func()

看上去沒啥毛病,使用reduce進行逐一的異或比較,最終得到了結果,可真的是這樣嗎?不妨讓我們來舉個栗子:

1^2 =3 那麼 1^2^3是多少?結果為0!

再寫下去,還是可以使用一些其他的方式實現。說這麼多隻是想告訴大家,遇到問題,多主動思考,即便想的是錯的,也能從錯誤中收穫知識。


分享到:


相關文章: