程序員代碼面試指南:IT名企算法與數據結構題目最優解(第2版) ( 簡體 字) |
作者:左程云 | 類別:1. -> 程式設計 -> 面試指南 |
譯者: |
出版社:電子工業出版社 | 3dWoo書號: 50461 詢問書籍請說出此書號!【缺書】 NT售價: 545 元 |
出版日:1/1/2019 |
頁數:576 |
光碟數:0 |
|
站長推薦: |
印刷:黑白印刷 | 語系: ( 簡體 版 ) |
|
加入購物車 │加到我的最愛 (請先登入會員) |
ISBN:9787121354861 |
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 序 |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證) |
作者序: |
譯者序: |
前言:自序
我能出書挺意外的。 在6年前的某一天,雖然我早就知道想進入那些大公司要靠“刷”代碼面試題來練習編寫代碼的能力。可是這一天卻不止如此,我突然有了心情去看代碼面試題長什么樣子,于是收集了代碼面試的題目。越深入,我越有一種恐慌的感覺,因為感覺自己什么都不太在行,對一個歸并排序(Merge sort)寫出完整的代碼都感覺挺費勁的,面對這個馮·諾依曼發明的排序算法,我真有底氣說自己是計算機專業的學生嗎?這種打擊并沒有持續太久,因為愛耍小聰明的人總會特別自信。我決定開始認真面對“刷”題這件事,但那時我根本不知道我即將面對什么,更不要談有寫書的念頭。 我把課余時間利用起來,心想:不就是“刷”題嗎?別人能寫出來,咱也能寫出來。起初的心態是我不服,我就想告訴自己能行。過程虐心是肯定的,經常半夜因為看到一個復雜度特別低的算法自己真的不能理解而沮喪地睡不著覺。當時覺得找不到什么資料能徹底讓我明白,書上講得太粗淺,網上的太散亂,代碼寫得看不懂。起初我“刷”題的時候無數次地想放棄,因為覺得這些都是什么玩意兒!我為什么放著好好的日子不過,去找這種罪受?可是我又不甘心,雖然我不懂很多解法,但是它們真的很有意思。 我將能買到的所有相關書籍上的所有題目全都研究了一遍,不管是中文的還是英文的,我都硬著頭皮“啃”。寫完每道題后,我都和書上的方法進行反復對比。“啃”完了五六本書之后,距離我剛開始“刷”題已經過去16個月了。寫書?別逗了,才剛看完。 “年輕人總會找借口說這個東西不是我感興趣的,所以做不好是應該的。但他們沒有注意的是,你面對的事情中感興趣的事情總是少數,這就使得大多數時候你做事情的態度總是很懈怠、很消極,這使你變成了一個懈怠的人。當你真正面對自己感興趣的東西時,你發現你已經攥不緊拳頭了。”時常想起本科時的畢業設計指導老師——高鵬義老師說的這段話。說得對!對一個東西,如果你沒有透徹研究過,不要輕易說它不精彩。這不是博愛,而是對自己認真。 “刷”題代碼達到4萬行的時候,我基本上成了國內外所有熱門“刷”題網站的日常用戶,此時我確認了一件事情,今天的代碼面試指導真的處在一個很初級的階段,這種不健全是全方面的。 例如: ? 經常看到一篇文章前后的語境是割裂的,作者經常根據之前的一個優良解法提出更好的優化方式,但整篇文章都不提之前的解法是什么。這就導致初學者根本無法看懂; ? 幾乎所有的書籍都忽略例子帶來的引導作用,甚至還有不少書籍在闡述一個解法的時候只寫偽代碼,這就使得讀者在看懂意思和自己真正能寫出代碼之間其實還有很多的路要走; ? 代碼面試題目的特點是“多”“雜”“難”,從著手開始學習到最終達到自己想要的效果之間,自己對自己的評估根本無從談起。“慢慢練吧,學海無涯”成為主要的心態,這就難免會產生懷疑的情緒; ? 看見一道新的面試題時還是會無從下手,因為之前的學習無法做到舉一反三,對自己做過的題目缺乏總結和歸納。 難道“刷”題真的只適合聰明人玩?我不這么看,既然大多數內容處在有待商榷的地步,那我就去學習原論文吧。 當時一個人在國外,記得在初冬的一個下午,“刷”題已經兩年之久,快吃晚飯的時候,我突然想起自己忘了吃午飯,就沖出家門去覓食。站在7-11門前的廣場上,我拿著1.5美元的熱狗和75美分的咖啡,微溫的陽光撒在眼睛里,遠遠地望著即將消失的一天。我停下來,把咖啡放在斑駁的石頭臺子上,手里的熱狗挺好看,香腸和洋蔥都挺新鮮,清冷的空氣吹過來,卻讓我的心緒更亂。舊金山的天空五彩斑斕,讓漂泊者頭暈目眩。哭得跟個鬼似的我除了想家,哪里敢想自己會出書呢? 當我意識到在網上很難搜到新鮮的題目時,我已經換了兩家公司,反復實現了600多道題目,寫了差不多10萬行代碼。原來只是為了找份工作而“刷”題這一初心早就忘了,變成了興趣并堅持了這么久,我自己也感到意外。更奇怪的是,我已經完全樂在其中,同時交流欲望越來越強,時常和同事們展開這方面的討論。發現很多書上的解法不是最優,很多題目其實和同事們討論的做法更好,發現高手特別多,但好像都懶得動筆。 有一天,我看到自己寫的題目,想到自己那些抓心撓肝的日子,突然覺得要不出書吧?我已經離不開這種感覺了,如果這不是真愛,那什么才是呢? 這不是一個勵志的故事,是一個愛“刷”題的人決定把很多最優解講出來,就這么簡單。
左程云 2015年7月20日 |
內容簡介:《程序員代碼面試指南:IT名企算法與數據結構題目最優解(第2版)》是一本程序員代碼面試"神書”!書中對IT名企代碼面試各類題目的最優解進行了總結,并提供了相關代碼實現。針對當前程序員面試缺乏權威題目匯總這一痛點,本書選取將近300道真實出現過的經典代碼面試題,幫助廣大程序員的面試準備做到接近萬無一失。"刷”完本書后,你就是"題王”!《程序員代碼面試指南:IT名企算法與數據結構題目最優解(第2版)》采用題目解答的方式組織內容,并把面試題類型相近或者解法相近的題目盡量放在一起,讀者在學習本書時很容易看出面試題解法之間的聯系,使知識的學習避免碎片化。書中將所有的面試題從難到易依次分為"將”“校”“尉”“士”四個檔次,方便讀者有針對性地選擇"刷”題。本書所收錄的所有面試題都給出了最優解講解和代碼實現,并且提供了一些普通解法和最優解法的運行時間對比,讓讀者真切地感受到最優解的魅力!《程序員代碼面試指南:IT名企算法與數據結構題目最優解(第2版)》中的題目全面且經典,更重要的是,書中收錄了大量新題和最優解分析,這些內容源自筆者多年來"死磕自己”的深入思考。程序員們做好準備在IT名企的面試中脫穎而出、一舉成名了嗎?這本書就是你應該擁有的"神兵利器”。當然,對需要提升算法和數據結構等方面能力的程序員而言,《程序員代碼面試指南:IT名企算法與數據結構題目最優解(第2版)》的價值也是顯而易見的。 |
目錄:第1章 棧和隊列 1 設計一個有getMin功能的棧(士 ★☆☆☆) 1 由兩個棧組成的隊列(尉 ★★☆☆) 5 如何僅用遞歸函數和棧操作逆序一個棧(尉 ★★☆☆) 7 貓狗隊列(難度:士 ★☆☆☆) 9 用一個棧實現另一個棧的排序(士 ★☆☆☆) 12 用棧來求解漢諾塔問題(校 ★★★☆) 13 生成窗口最大值數組(尉 ★★☆☆) 18 單調棧結構(尉 ★★☆☆) 20 求最大子矩陣的大小(校 ★★★☆) 26 最大值減去最小值小于或等于num的子數組數量(校 ★★★☆) 31 可見的山峰對數量(原問題 士 ★☆☆☆ 進階問題 將 ★★★★) 33
第2章 鏈表問題 41 打印兩個有序鏈表的公共部分(士 ★☆☆☆) 41 在單鏈表和雙鏈表中刪除倒數第K個節點(士 ★☆☆☆) 42 刪除鏈表的中間節點和a/b處的節點(士 ★☆☆☆) 45 反轉單向和雙向鏈表(士 ★☆☆☆) 47 反轉部分單向鏈表(士 ★☆☆☆) 48 環形單鏈表的約瑟夫問題(原問題 士 ★☆☆☆ 進階 校 ★★★☆) 50 判斷一個鏈表是否為回文結構(普通解法 士 ★☆☆☆ 進階解法 尉 ★★☆☆) 55 將單向鏈表按某值劃分成左邊小、中間相等、右邊大的形式(尉 ★★☆☆) 59 復制含有隨機指針節點的鏈表(尉 ★★☆☆) 63 兩個單鏈表生成相加鏈表(士 ★☆☆☆) 66 兩個單鏈表相交的一系列問題(將 ★★★★) 69 將單鏈表的每K個節點之間逆序(尉 ★★☆☆) 74 刪除無序單鏈表中值重復出現的節點(士 ★☆☆☆) 77 在單鏈表中刪除指定值的節點(士 ★☆☆☆) 79 將搜索二叉樹轉換成雙向鏈表(尉 ★★☆☆) 81 單鏈表的選擇排序(士 ★☆☆☆) 84 一種怪異的節點刪除方式(士 ★☆☆☆) 86 向有序的環形單鏈表中插入新節點(士 ★☆☆☆) 87 合并兩個有序的單鏈表(士 ★☆☆☆) 88 按照左右半區的方式重新組合單鏈表(士 ★☆☆☆) 90
第3章 二叉樹問題 93 分別用遞歸和非遞歸方式實現二叉樹先序、中序和后序遍歷(校 ★★★☆) 93 打印二叉樹的邊界節點(尉 ★★☆☆) 100 如何較為直觀地打印二叉樹(尉 ★★☆☆) 104 二叉樹的序列化和反序列化(士 ★☆☆☆) 107 遍歷二叉樹的神級方法(將 ★★★★) 111 在二叉樹中找到累加和為指定值的最長路徑長度(尉 ★★☆☆) 119 找到二叉樹中的最大搜索二叉子樹(尉 ★★☆☆) 121 找到二叉樹中符合搜索二叉樹條件的最大拓撲結構(校 ★★★☆) 124 二叉樹的按層打印與ZigZag打印(尉 ★★☆☆) 132 調整搜索二叉樹中兩個錯誤的節點(原問題 尉 ★★☆☆ 進階問題 將 ★★★★) 137 判斷t1樹是否包含t2樹全部的拓撲結構(士 ★☆☆☆) 142 判斷t1樹中是否有與t2樹拓撲結構完全相同的子樹(校 ★★★☆) 144 判斷二叉樹是否為平衡二叉樹(士 ★☆☆☆) 146 根據后序數組重建搜索二叉樹(士 ★☆☆☆) 148 判斷一棵二叉樹是否為搜索二叉樹和完全二叉樹(士 ★☆☆☆) 150 通過有序數組生成平衡搜索二叉樹(士 ★☆☆☆) 152 在二叉樹中找到一個節點的后繼節點(尉 ★★☆☆) 153 在二叉樹中找到兩個節點的最近公共祖先(原問題 士 ★☆☆☆ 進階問題 尉 ★★☆☆ 再進階問題:校 ★★★☆) 155 Tarjan算法與并查集解決二叉樹節點間最近公共祖先的批量查詢問題(校 ★★★☆) 160 二叉樹節點間的最大距離問題(尉 ★★☆☆) 168 派對的最大快樂值(尉 ★★☆☆) 169 通過先序和中序數組生成后序數組(士 ★☆☆☆) 172 統計和生成所有不同的二叉樹(尉 ★★☆☆) 173 統計完全二叉樹的節點數(尉 ★★☆☆) 176 第4章 遞歸和動態規劃 179 斐波那契系列問題的遞歸和動態規劃(將 ★★★★) 179 矩陣的最小路徑和(尉 ★★☆☆) 185 換錢的最少貨幣數(尉 ★★☆☆) 189 機器人達到指定位置方法數(尉 ★★☆☆) 192 換錢的方法數(尉 ★★☆☆) 199 打氣球的最大分數(校 ★★★☆) 204 最長遞增子序列(校 ★★★☆) 210 信封嵌套問題(校 ★★★☆) 214 漢諾塔問題(校 ★★★☆) 217 最長公共子序列問題(尉 ★★☆☆) 220 最長公共子串問題(校 ★★★☆) 223 子數組異或和為0的最多劃分(校 ★★★☆) 227 最小編輯代價(校 ★★★☆) 230 字符串的交錯組成(校 ★★★☆) 233 龍與地下城游戲問題(尉 ★★☆☆) 236 數字字符串轉換為字母組合的種數(尉 ★★☆☆) 238 表達式得到期望結果的組成種數(校 ★★★☆) 240 排成一條線的紙牌博弈問題(尉 ★★☆☆) 245 跳躍游戲(士 ★☆☆☆) 247 數組中的最長連續序列(尉 ★★☆☆) 248 N皇后問題(校 ★★★☆) 249 第5章 字符串問題 253 判斷兩個字符串是否互為變形詞(士 ★☆☆☆) 253 判斷兩個字符串是否互為旋轉詞(士 ★☆☆☆) 254 將整數字符串轉成整數值(尉 ★★☆☆) 255 字符串的統計字符串(士 ★☆☆☆) 258 判斷字符數組中是否所有的字符都只出現過一次 (按要求1實現的方法 士 ★☆☆☆ 按要求2實現的方法 尉 ★★☆☆) 261 在有序但含有空的數組中查找字符串(尉 ★★☆☆) 263 字符串的調整與替換(士 ★☆☆☆) 265 翻轉字符串(士 ★☆☆☆) 267 完美洗牌問題(將 ★★★★) 270 刪除多余字符得到字典序最小的字符串(尉 ★★☆☆) 276 數組中兩個字符串的最小距離(尉 ★★☆☆) 279 字符串的轉換路徑問題(尉 ★★☆☆) 281 添加最少字符使字符串整體都是回文字符串(校 ★★★☆) 285 括號字符串的有效性和最長有效長度 (原問題 士 ★☆☆☆ 補充問題 尉 ★★☆☆) 290 公式字符串求值(校 ★★★☆) 292 0左邊必有1的二進制字符串數量(校 ★★★☆) 294 拼接所有字符串產生字典順序最小的大寫字符串(校 ★★★☆) 297 找到字符串的最長無重復字符子串(尉 ★★☆☆) 300 找到被指的新類型字符(士 ★☆☆☆) 302 旋變字符串問題(將 ★★★★) 303 最小包含子串的長度(校 ★★★☆) 310 回文最少分割數(尉 ★★★☆) 314 字符串匹配問題(校 ★★★☆) 316 字典樹(前綴樹)的實現(尉 ★★★☆) 320 子數組的最大異或和(校 ★★★☆) 324 第6章 大數據和空間限制 330 認識布隆過濾器(尉 ★★☆☆) 330 只用2GB內存在20億個整數中找到出現次數最多的數(士 ★☆☆☆) 335 40億個非負整數中找到沒出現的數(尉 ★★☆☆) 336 找到100億個URL中重復的URL以及搜索詞匯的top K問題(士 ★☆☆☆) 337 40億個非負整數中找到出現兩次的數和所有數的中位數(尉 ★★☆☆) 338 一致性哈希算法的基本原理(尉 ★★☆☆) 339 島問題(原問題 尉 ★★☆☆ 進階問題 將 ★★★★) 342 第7章 位運算 348 不用額外變量交換兩個整數的值(士 ★☆☆☆) 348 不用做任何比較判斷找出兩個數中較大的數(校 ★★★☆) 349 只用位運算不用算術運算實現整數的加減乘除運算(尉 ★★☆☆) 350 整數的二進制表達中有多少個1(尉 ★★☆☆) 355 在其他數都出現偶數次的數組中找到出現奇數次的數(尉 ★★☆☆) 357 在其他數都出現k次的數組中找到只出現一次的數(尉 ★★☆☆) 359 第8章 數組和矩陣問題 361 轉圈打印矩陣(士 ★☆☆☆) 361 將正方形矩陣順時針轉動90°(士 ★☆☆☆) 363 “之”字形打印矩陣(士 ★☆☆☆) 364 找到無序數組中最小的k個數 (O(Nlogk)的方法 尉 ★★☆☆ O(N)的方法 將 ★★★★) 366 需要排序的最短子數組長度(士 ★☆☆☆) 371 在數組中找到出現次數大于N/K的數(校 ★★★☆) 372 在行列都排好序的矩陣中找數(士 ★☆☆☆) 376 最長的可整合子數組的長度(尉 ★★☆☆) 378 不重復打印排序數組中相加和為給定值的所有二元組和三元組 (尉 ★★☆☆) 380 未排序正數數組中累加和為給定值的最長子數組長度(尉 ★★☆☆) 382 未排序數組中累加和為給定值的最長子數組系列問題(尉 ★★☆☆) 384 未排序數組中累加和小于或等于給定值的最長子數組長度(將 ★★★★) 386 計算數組的小和(校 ★★★☆) 392 自然數數組的排序(士 ★☆☆☆) 394 奇數下標都是奇數或者偶數下標都是偶數(士 ★☆☆☆) 396 子數組的最大累加和問題(士 ★☆☆☆) 397 子矩陣的最大累加和問題(尉 ★★☆☆) 398 在數組中找到一個局部最小的位置(尉 ★★☆☆) 401 數組中子數組的最大累乘積(尉 ★★☆☆) 402 打印N個數組整體最大的Top K(尉 ★★☆☆) 404 邊界都是1的最大正方形大小(尉 ★★☆☆) 406 不包含本位置值的累乘數組(士 ★☆☆☆) 409 數組的partition調整(士 ★☆☆☆) 411 求最短通路值(尉 ★★☆☆) 413 數組中未出現的最小正整數(尉 ★★☆☆) 415 數組排序之后相鄰數的最大差值(尉 ★★☆☆) 416 做項目的最大收益問題(尉 ★★☆☆) 418 分金條的最小花費(尉 ★★☆☆) 421 大樓輪廓問題(將 ★★★★) 423 加油站良好出發點問題(校 ★★★☆) 432 容器盛水問題(校 ★★★☆) 439 第9章 其他題目 444 從5隨機到7隨機及其擴展 (原問題 尉 ★★☆☆ 補充問題 尉 ★★☆☆ 進階問題 校 ★★★☆) 444 一行代碼求兩個數的最大公約數(士 ★★☆☆) 448 有關階乘的兩個問題(原問題 尉 ★★☆☆ 進階問題 校 ★★★☆) 448 判斷一個點是否在矩形內部(尉 ★★☆☆) 451 判斷一個點是否在三角形內部(尉 ★★☆☆) 452 折紙問題(尉 ★★☆☆) 456 能否完美地拼成矩形(尉 ★★☆☆) 457 蓄水池算法(尉 ★★☆☆) 460 設計有setAll功能的哈希表(士 ★☆☆☆) 461 最大的leftMax與rightMax之差的絕對值(校 ★★★☆) 463 設計LRU緩存結構(尉 ★★☆☆) 465 LFU緩存結構設計(校 ★★★☆) 469 設計RandomPool結構(尉 ★★☆☆) 474 并查集的實現(尉 ★★☆☆) 476 調整[0,x)區間上的數出現的概率(士 ★☆☆☆) 480 路徑數組變為統計數組(校 ★★★☆) 481 正數數組的最小不可組成和(尉 ★★☆☆) 486 累加出整個范圍所有的數最少還需幾個數(尉 ★★☆☆) 489 一種字符串和數字的對應關系(校 ★★★☆) 491 1到n中1出現的次數(校 ★★★☆) 494 從N個數中等概率打印M個數(士 ★☆☆☆) 497 判斷一個數是否是回文數(士 ★☆☆☆) 498 在有序旋轉數組中找到最小值(尉 ★★☆☆) 499 在有序旋轉數組中找到一個數(尉 ★★☆☆) 501 數字的英文表達和中文表達(校 ★★★☆) 503 分糖果問題(校 ★★★☆) 509 一種消息接收并打印的結構設計(尉 ★★☆☆) 512 隨時找到數據流的中位數(尉 ★★☆☆) 516 在兩個長度相等的排序數組中找到上中位數(尉 ★★☆☆) 518 在兩個排序數組中找到第K小的數(將 ★★★★) 521 兩個有序數組間相加和的TOP K問題(尉 ★★☆☆) 523 出現次數的TOP K問題(原問題 尉 ★★☆☆ 進階問題 校 ★★★☆) 526 Manacher算法(將 ★★★★) 535 KMP算法(將 ★★★★) 542 丟棋子問題(校 ★★★☆) 548 畫匠問題(校 ★★★☆) 555 郵局選址問題(校 ★★★☆) 559 |
序: |