1024程序員節
10.24程序員節
今天是1024程序猿/媛的節日,本來聽起來不錯,可是想到明天項目轉測,估計又不知道要加班到幾點就覺得心塞….為什麼明明是程序員的節日,自己卻要加班!
是因為我沒有穿格子衫?
程序員穿搭標配
或是我的髮際線不達標?
程序員髮際線
歸根結底,還是自身技術不過關,頂多算是個搬磚的
專業搬磚三十年
CTRL+C & CTRL+V
經常遇到來面試的人員,問到為什麼從上家公司離職,回答的無外乎薪資問題、感覺在公司沒有提升空間、想找個更好的發展平臺,等等…但大家是否想過,每天CTRL+C & CTRL+V的工作心態與if else 的編程思路,是公司沒有給你提升的空間,還是自己不想著自我提升呢?
細思恐極
一道簡單習題引發的思考
今天無意間看到一道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!
再寫下去,還是可以使用一些其他的方式實現。說這麼多隻是想告訴大家,遇到問題,多主動思考,即便想的是錯的,也能從錯誤中收穫知識。
閱讀更多 一枚程序媛呀 的文章