-
1 # 慕課網
-
2 # 掘客DIGGKR
while(true){
}
有意思的不行,機器都掛了,公司破產了,老闆在抹淚...
-
3 # 目前中年
在別人blog中看到過一個fizzbuzz的故事。
要求寫一個程式輸出1到100,但是遇到數字為3的倍數時輸出Fizz,5的倍數輸出Buzz,既是3的倍數又是5的倍數輸出FizzBuzz。
就是如此簡單的面試題,那個哥們用深度學習的思路寫了這個程式碼。面試者與面試官的對話很有意思,推薦大家去搜索瞭解一下。
-
4 # 華為雲開發者聯盟
設計模式的藝術:用狀態模式告別if-else
面對判斷分支異常多、狀態變化異常複雜的業務邏輯程式碼,在大量if-else中遨遊往往會犯惡心,甚至懷疑起了人生。
例如“手寫一個判斷函式,確認字串是否是一個合法的科學數字表達式”這種常見的業務邏輯問題。
如果用if-else寫,就會變成如下醜陋的程式碼:
每次維護這種程式碼,總是都要從頭閱讀一遍,確認自己要在哪裡修改,彷彿在修補一個破舊的大棉襖。
但我們如果使用了設計模式中的狀態機模式來進行重構,整塊程式碼就會非常精妙。
首先要畫出一副如下所示的狀態演變圖:
圖源來自leetcode
狀態圖繪製完成之後,就可以根據狀態變化的合理性,確認狀態是否符合要求。
程式碼如下所示:
併發程式設計的藝術:詭異的Java程式碼揭示了cpu快取的原理
著名的Java併發程式設計大師Doug lea在JDK 7的併發包裡新增一個佇列集合類Linked-TransferQueue,它在使用volatile變數時,用一種追加位元組的方式來最佳化隊列出隊和入隊的效能。LinkedTransferQueue的程式碼如下,著重關注p0~pe的定義:
追加位元組能最佳化效能?這種方式看起來很神奇,但如果深入理解處理器架構就能理解其中的奧秘:(以下的解釋來自《Java併發程式設計的藝術一書》 )
“因為對於英特爾酷睿i7、酷睿、Atom和NetBurst,以及Core Solo和Pentium M處理器的L1、L2或L3快取的快取記憶體行是64個位元組寬,不支援部分填充快取行。這意味著,如果佇列的頭節點和尾節點都不足64位元組的話,處理器會將它們都讀到同一個快取記憶體行中,在多處理器下每個處理器都會快取同樣的頭、尾節點。當一個處理器試圖修改頭節點時,會將整個快取行鎖定,那麼在快取一致性機制的作用下,會導致其他處理器不能訪問自己快取記憶體中的尾節點,而佇列的入隊和出隊操作則需要不停修改頭節點和尾節點,所以在多處理器的情況下將會嚴重影響到佇列的入隊和出隊效率。因此Doug lea使用追加到64位元組的方式來填滿高速緩衝區的快取行,避免頭節點和尾節點載入到同一個快取行,使頭、尾節點在修改時不會互相鎖定。
可以看到,在java的併發程式碼中能夠體現底層快取的設計。雖然這程式碼不太符合java希望遮蔽底層實現細節的設計理念,但是Doug lea大師對細節的考慮仍然讓人讚歎不已。
演算法的藝術:用搜索解決迷宮問題
學習資料結構時,相信“深度優先搜尋”和“廣度優先搜尋”對初學者來說一度是一個噩夢,做練習題時也是用各種姿勢遍歷去二叉樹,無法感受到樂趣所在。
但是當你用搜索來解決比較簡單的迷宮尋路問題時,便會感到演算法的魅力。
想起小時候玩一些RPG遊戲,往往會有各種迷宮,每次自己探索出口時,其實就是用的深度搜索,找不到會回溯,然而這樣費時間也費腦子,當地圖過大,大腦的快取不足,或者思考深度不足時,解決起來就很困難。
但如果有計算機的幫忙,對於每次的移動,給定地圖輸入,使用搜索演算法、A*等演算法,便能夠快速找到迷宮的離開路線。
下面給出一個虛擬碼,來簡單解釋搜尋問題是怎麼解決問題的:
所以當你學習完搜尋演算法,卻還對其應用感到困惑時,不妨來做一道迷宮尋路題.(例如http://poj.org/problem?id=3984)
或者自己寫一個五子棋對戰程式與自己對戰。對戰程式除了搜尋演算法,還要考慮博弈論的思想,透過alpha-beta演算法來處理敵對雙方對結果的選擇,編寫評估函式來定義對局面好壞的判斷, 整個編寫過程會更加複雜而有趣,不妨作為自己對搜尋演算法更深層次的學習時嘗試一番。
二進位制的藝術:用數學節省了空間
“給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素,而且不能用額外空間”
甚至還有升級版:
“給你一個整數陣列 ,除某個元素僅出現一次外,其餘每個元素都恰出現 三次 。請你找出並返回那個只出現了一次的元素。”
第一想法肯定是維護一個雜湊表或者陣列。但是問題要求不能用額外空間,這一般都是為了在有成本限制的環境下考慮和設計的,例如記憶體有限的某些硬體裝置中。
因此在最佳解法中,選擇藉助了二進位制來解決這個問題。透過同位異或得0,不同位異或得1的特性,快速過濾掉相同的數字:
是不是感覺非常巧妙有趣,利用數學的二進位制特性,簡單的異或就搞定了本來需要大量記憶體的問題,不禁令人拍案叫絕。
回覆列表
都說程式設計師木訥無趣,今天就藉機讓大家領略一下什麼叫隱藏在程式碼裡的有趣靈魂。
話不多說,follow me!
1.離職彩蛋——會自殺的檔案
離職時電腦裡的檔案帶不走,又不想被別人撿漏?不妨給檔案下一個“自殺”指令。直白地說就是在Excel檔案的VBA裡編制一段“自殺”程式碼,只要有人啟用該檔案的宏,檔案就會神奇的消失,是不是有點奇幻色彩?
這還不是最牛的,更厲害的地方在於你可以為檔案設定一個“自殺”期限或者限制一定的“自殺”次數。比如,為了避免影響工作交接,你可以把啟動“自殺”的時間設定在交接完成之後,只要有人再開啟你的工作簿啟用宏,檔案就會忠誠的“死去”;設定次數的方式比較適合於炫技場景,例如設定了5次“自殺”機會,你大可以把前5次機會讓給別人,事實上無論是誰開啟都會發生檔案“自殺”事件,而到第6次的時候一定要親自上陣,向大家展示什麼是“天選之子”。
2. 小霸王程式碼
不知道程式設計師們有沒有玩過小霸王486?據說有人曾在第一次接觸到這種“電腦”的時候,懷著無比激動的心情,在它的GBASIC程式下面敲下了自己人生中的第一行程式碼“what is your name?”即便是一行跑不通的程式碼,也讓人興奮不已。
3.手機的隱藏程式碼
買了新手機卻忘記了手機序列號?別急,其實除了看手機的包裝盒外,直接用手機中“關於手機”也能查到手機序列號。不過今天要說的是大部分手機在出廠之前就被安裝了一組神奇的程式碼,只需要在手機的撥號介面,輸入“*#06#”就會出現手機的IMEI碼,部分手機可以透過該序列號查詢到手機的真偽以及啟用保修等資訊。不用擔心買到假手機了,開森~
4.PHP一行程式碼的巨大威力
不得不說PHP是“全世界最好的程式語言”,因為你只需要在編輯器裡輸入書上的示例程式碼
重新整理瀏覽器的頁面就會出現奇蹟!
驚不驚喜?服不服氣?開不開森?PHP是世界上最好的語言沒有錯吧,一行程式碼就輸出了這麼一大頁東西!
5.Python控制程式操縱瀏覽器
什麼?Python才是王道?那就學起來吧!開啟IDLE,輸入下面的程式碼:
再按一下回車鍵,意外之喜!程式竟然可以操縱我的瀏覽器了!
6.會跳舞的圖片
閒來無聊娛樂一下,你可以在瀏覽器位址列裡輸入一段程式碼,讓網頁裡的圖片在螢幕上飛舞起來,有沒有很神奇?
javascript:R=0; x1=.1; y1=.05; x2=.25; y2=.24; x3=1.6; y3=.24; x4=300; y4=200; x5=300; y5=200; var DI= document.getElementsByTagName("img"); DIL=DI.length; function A(){for(i=0; i<DIL; i++){DIS=DI[ i ].style; DIS.position="absolute"; DIS.left=Math.sin(R*x1+i*x2+x3)*x4+x5+"px"; DIS.top=Math.cos(R*y1+i*y2+y3)*y4+y5+"px"}R++}tag=setInterval("A()",5 );document.onmousedown=function(){clearInterval(tag);for(i=0; i<DIL; i++){DI[i].style.position="static";}}; void(0)Ps.有時貼上時瀏覽器會自動吃掉“javascript:”這幾個字元,手動敲上就可以~
7.編輯頁面文字
在瀏覽頁面的時候想要複製一段文字,卻發現文字不能被編輯?其實方法很簡單,按F12快鍵開啟控制檯,在控制檯裡面輸入
你就會發現頁面中的所有文字都可以編輯了,而且絕大部分網頁介面都可以這麼用。
8.用PHP程式碼作畫
程式碼能作畫,不到20行PHP程式碼也可以繪製一個複雜美麗的影象,而你只需要敲出下面這些程式碼:
看,作品成功出爐了。
9.製作無法關閉的對話方塊
工作的時候最煩電腦不聽指揮,但其實有些也可能是人為惡搞的小把戲,例如在瀏覽器的位址列裡輸入一段神奇的程式碼,你將得到一個無法關閉的對話方塊。
10.駭客帝國程式碼雨效果
將這段程式碼用記事本儲存為一個bat批處理檔案,比如yu.bat,按WIN+R開啟執行對話方塊,輸入CMD,在CMD裡面執行該檔案,就會出現駭客帝國程式碼雨的效果了。
@echo off color 02 :start echo %random% %random% %random% %random% %random% %random% %random% %random% %random% %random% goto start11.“調皮”的光碟機
不要在安裝有光碟機的LINUX電腦執行下列程式,否則打賭你的光碟機總是會自動彈開。
12.一行“累死”CPU的程式碼
看吧,碼農的世界豐富多彩,黑夜給了碼農黑色的眼睛,我們卻用它來尋找程式碼裡的光明……希望這些小程式碼能激起你學習程式設計的興趣哦~