為什么10.24程序員節(jié),我卻需要加班?
1024程序員節(jié)
10.24程序員節(jié)
今天是1024程序猿/媛的節(jié)日,本來聽起來不錯,可是想到明天項目轉(zhuǎn)測,估計又不知道要加班到幾點就覺得心塞….為什么明明是程序員的節(jié)日,自己卻要加班!
是因為我沒有穿格子衫?
程序員穿搭標(biāo)配
或是我的發(fā)際線不達標(biāo)?
程序員發(fā)際線
歸根結(jié)底,還是自身技術(shù)不過關(guān),頂多算是個搬磚的。
專業(yè)搬磚三十年
CTRL+C & CTRL+V
經(jīng)常遇到來面試的人員,問到為什么從上家公司離職,回答的無外乎薪資問題、感覺在公司沒有提升空間、想找個更好的發(fā)展平臺,等等…但大家是否想過,每天CTRL+C & CTRL+V的工作心態(tài)與if else 的編程思路,是公司沒有給你提升的空間,還是自己不想著自我提升呢?
細思恐極
一道簡單習(xí)題引發(fā)的思考
今天無意間看到一道python習(xí)題,題目是這樣的:
有一個長度在1-10000之間的數(shù)字列表,它們通過逗號分隔,其中涵蓋了0-1000的重復(fù)數(shù)字,比如1,4,3,5,3,5,4,該列表中有且僅有一個數(shù)字出現(xiàn)了奇數(shù)次,請通過代碼獲得該列表中,那個出現(xiàn)奇數(shù)次的數(shù)字。
常規(guī)解法
打眼一看這道題,感覺很無腦,無非是列表轉(zhuǎn)集合,然后for循環(huán)集合中的數(shù)字,通過count進行計算就OK了么,代碼如下:
- 1# -*- coding: utf-8 -*-
- 2# @Author : 王翔
- 3# @WeChat : King_Uranus
- 4# @公眾號 : 清風(fēng)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 : 常規(guī)解法.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("找到符合要求的數(shù)字: {}".format(num))
- 17 break
- 18 else:
- 19 print("未找到符合要求的數(shù)字")
- 20
- 21if __name__ == '__main__':
- 22 func()
for else確實是python中比較特殊的一個語法結(jié)構(gòu),如果for循環(huán)正常執(zhí)行結(jié)束,則執(zhí)行else內(nèi)的語句。但程序說的很清楚列表中有且僅有一個數(shù)字出現(xiàn)了奇數(shù)次,完全沒有必要畫蛇添足。
強行顯擺解法
大家都知道,如果面試的時候,你能將題目通過多種方式實現(xiàn),那么肯定會得到更高的認可對,然后有了下面的強行裝13解法:
- 1# -*- coding: utf-8 -*-
- 2# @Author : 王翔
- 3# @WeChat : King_Uranus
- 4# @公眾號 : 清風(fēng)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函數(shù).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("找到符合要求的數(shù)字: {}".format(k))
- 19 break
- 20
- 21if __name__ == '__main__':
- 22 func()
itertools的groupby在日常中使用的比較少。groupby聚合函數(shù)與日常使用的sql等聚合方式一致,最終生成key:value的鍵值對,value為迭代對象。
更為簡潔的Counter
python中collections模塊附帶有一個Counter的函數(shù),使用它能讓我們裝13時,顯得沒有上面那么僵硬:
- 1# -*- coding: utf-8 -*-
- 2# @Author : 王翔
- 3# @WeChat : King_Uranus
- 4# @公眾號 : 清風(fēng)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函數(shù).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("找到符合要求的數(shù)字: {}".format(k))
- 19 break
- 20
- 21if __name__ == '__main__':
- 22 func()
裝X翻車現(xiàn)場
本來這道題到這里該結(jié)束了,但仔細想想,還有什么方式可以用來統(tǒng)計元素數(shù)量的奇偶性呢?不管是python還是java等其他編程語言,都存在一個異或的操作,是否可以使用它來實現(xiàn)。
1^3^1 = 3
然后想當(dāng)然的,我就寫出了下面的代碼:
- 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進行逐一的異或比較,最終得到了結(jié)果,可真的是這樣嗎?不妨讓我們來舉個栗子:
1^2 =3 那么 1^2^3是多少?結(jié)果為0!
再寫下去,還是可以使用一些其他的方式實現(xiàn)。說這么多只是想告訴大家,遇到問題,多主動思考,即便想的是錯的,也能從錯誤中收獲知識。