欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

程序員遇到很難的技術問題是怎樣的感覺

劉姿婷2年前18瀏覽0評論
程序員遇到很難的技術問題是怎樣的感覺?

導航

引子回字有四種種寫法從一道小提說起算法是程序的靈魂打破砂鍋問到底參考??本文由智客工坊--頂級碼農原創,感謝您的閱讀,預計閱讀時長3min。

算法是程序的靈魂——佚名

引子

彈指間,在互聯網行業已經十年了。

或許您也有這樣的感受,在日常編碼的過程中,一切看起來都是風輕云淡,各自安好。但是,代碼發布的生產環境,總會出現一些不可預知的bug,或者遇到一些"詭異"的問題,他們就像幽靈一樣潛伏在代碼之中,并在某一個特定場景之下暴露出來。

這是導致程序員們瘋狂加班的罪魁禍首。

回顧筆者的職業生涯中,導致加班到凌晨甚至通宵的一般都是算法問題。

回字有四種寫法

孔乙己顯出極高興的樣子,將兩個指頭的長指甲敲著柜臺,點頭說,“對呀對呀!……回字有四樣寫法,你知道么?”我愈不耐煩了,努著嘴走遠。孔乙己剛用指甲蘸了酒,想在柜上寫字,見我毫不熱心,便又嘆一口氣,顯出極惋惜的樣子。

魯迅筆下的孔乙己總是一副窮酸書生的形象,被人恥笑。然而,換個角度來看,從做學問上了講,從一個嚴謹的技術的角度來看,孔乙己弄清楚回字的不同寫法是很有必須要的。因為,每種回字的使用場景看能不同。

那么,這個和算法有什么關系呢?

這里說的算法不一定是有教材上的例舉的經典算法,如大家耳熟能詳的選擇排序,冒泡,二叉樹,最短路徑算法....泛指一切從業務中抽象出來實現方法。

算法是用來解決問題的方法,方法越多,支持的場景越多,擬解決問題的能力就越強。這就好像你擁有一個超級武器庫,兵來將擋,水來土掩。

從一道小提說起

這是最近一次項目迭代發版,讓我加班的問題(預計19點下班,足足搞到22點)。

應用場景如下:

給定用戶登錄/登出狀態變更記錄日志,實時計算用戶的在線時長。

到這里,筆者建議各位看官暫停10s,思考一下,這個需求您會如何實現呢? 歡迎在評論區留言交流。

好了,這里不再賣關子了。這個問題背后其實蘊藏一個**刪除數組中連續的重復項。**的算法問題。

因為我們計算的在線時長是從在線狀態到非在線狀態之間間隔時間,然后將它們累加起來。而狀態記錄可能是5min記錄一次,或者因為接口調用異常導致出現連續相同狀態。

正確地做法是對這些原始狀態日志進行預處理,刪除數組中連續的重復項。

這里給出筆者的算法:

這里給出兩種實現方案(C#版本),Java,python的后續補充上):

public static List<int> allStates = new List<int> { 1, 1, 2, 2, 2, 3, 3,3,3,4 };

實現方案1(正向遍歷):

public static List<UserUseState> Remove2(List<UserUseState> list) { List<UserUseState> newArr = list; for (var i = 0; i < newArr.Count - 1; i++) { if (i == 0) continue; var currentItem = newArr[i]; var nextItem = newArr[i + 1]; if (currentItem.State == nextItem.State) { newArr.Remove(nextItem); i--; } } return newArr; }

實現方案2(反向遍歷):

public static List<int> Remove3(List<int> list) { for (var i = 0; i < list.Count - 1; i++) { var currentItem = list[i]; var nextItem = list[i + 1]; if (currentItem == nextItem) { list.Remove(currentItem); i--; } } return list; }

算法是程序的靈魂

程序=數據結構+算法

隨著技術框架的大量出現,很多算法其實是被框架封裝了。 這個確實降低了編程的門檻,但是對于很多新場景和實際應用,可能不一定會有現成的算法。 這個時候個人原本的算法思維能力就體現出來了。

這個就很好理解為啥大廠面試總是會考察各種算法,因為這個在實際工作中真的用得上。比如, 提升數據庫查詢速度,代碼優化等...

有空的同學還是建議一個多關注一下算法,可以做一下練習。

打破砂鍋問到底

但是,話又說回來,普通的業務編程中其實是很少遇到刁鉆的算法問題。可能前面架構師和高級工程師已經幫大家把這些問題都掃平了。

但是,我們遇到問題的時候可以進一步去探究。比如,就拿這個看似很普通的計算在線時長的問題,還有沒有別的更好地解決方案呢?答案是肯定的。

有一個網友提供的方案,可以參考一下玩家在線時長統計

有興趣的同學可以詳細進去看看:http://www.gtrdo.com/2019/01/30/玩家在線時長統計/

在開發中,一定會遇到各種特殊場景和特殊的功能實現,遇到特殊的問題。遇到這些問題,多多琢磨一下,要有敢于打破砂鍋問到底的精神,才能看問題更深入,探尋出多個解決方案,從而得到更佳解決方案。

參考

https://www.52interview.com/Exercise/Daily