㈠ 大廠面試高頻題:十進制有理數轉二進制演算法
十進制數轉換為二進制數時,由於整數和小數的轉換方法不同,所以先將十進制數的整數部分和小數部分分別轉換後,再加以合並。
2.十進制小數轉換為二進制小數
十進制小數轉換成二進制小數採用"乘2取整,高滲順序排列"法。具體做法是:用2乘十進制小數,可以得到積,將積的整數部分取出,再用2乘餘下的小數部分,又得到一個積,再將積的整數部分取出,如此進行,直到積中的小數部分為零,或者達到所要求的精度為止。
然後把取出的整數部分按順序排列起來,先取的整數作為二進吵派制小數的高位有效位,後取的整數升念賀作為低位有效位。
㈡ 大廠的前端面試難嗎
分享給你一些面試題
一面
小米的面試官給人的感覺很親切很真誠,是一個體驗很不錯的面試。
css 實現圖片自適應寬高
講 flex,手寫出 flex 常用的屬性,並且講出作用
BFC 是什麼
項目裡面的前端鑒權是怎麼實現的?
vue 裡面的虛擬 dom 是怎麼回事?
vue 雙向綁定講一講
手寫函數防抖和函數節流
講講常用的 es6 語法,比如 let、promise、class 等等
瀏覽器渲染過程,迴流重繪等等,load、DOMContentLoaded 等等事件的觸發順序
從小米應用商店裡面隨便找了一個需求讓我現場實現,寫偽代碼
二面
講項目裡面的鑒權和圖片懶載入怎麼實現的
講 vue-lazyloader 的原理,手寫偽代碼
講 express 框架的設計思想
線上日誌是如何處理的
講事件循環
講 nodejs 的 eventEmitter 的實現
三面
講項目裡面做的事情
講 vue 的響應式原理、依賴收集、監聽數組、虛擬 dom 等等
講 express 的中間件系統是如何設計的
現場從小米應用商店中找出一個需求現場實現,說思路,寫關鍵的代碼
四面
講 vue-lazyloader 源碼以及設計
使用 es5 實現 es6 的 class
websocket 握手過程
瀏覽器的事件循環和 nodejs 事件循環的區別
百思編程(過)
這個公司是獵頭推薦的,CEO 比較強勢,也算比較有趣。
一面
跨域以及解決辦法
手寫一段小演算法
javaScript 的 sort 方法內部使用的什麼排序?
二面
這一面是 CEO 面,主要問了我的職業規劃等等問題,在我沒有表現出很強的要去該公司的意願後,直接給我送走了…
ponyAI-基礎架構(過)
一面
講項目裡面幹了啥
vue-lazyloader 怎麼實現的
vue 的響應式系統、虛擬 dom
函數式編程
手寫了一個演算法題
二面
這輪面試時從美國打電話過來的,事後才知道是 Google 的前端…
講講項目裡面做了什麼
vue 原理,和 react 的區別(其實我沒怎麼用過 react)
JavaScript 非同步的處理方式,現場出了一個問題,使用 promise 實現
三面
講項目模塊規劃、項目如何部署、如何優化等等
手寫函數的防抖
手寫一道演算法題
四面
講講項目
手寫一道演算法題
洋錢罐(過)
一面
講項目
前端持久化的方式、區別
vue-lazyloader 的原理
怎麼配 webpack
手寫 vue 雙向綁定
講 es6 的一些特性,並且現場出了幾個代碼片段,說結果
手寫一道演算法題
http 狀態碼
二面
講項目
vue-router 的原理
項目中怎麼用的 webpack,怎麼優化
講 express 的設計原理
手寫一道演算法題
創新奇智(過)
一面
講項目
手動實現 parseInt
二面
這一面居然遇到了前同事…寫了一些筆試題,問了一些問題!
三面
講 tcp/ip 網路層、三次握手,為什麼不能兩次握手
講 vue 原理
手寫一道演算法題
猿輔導(跪)
猿輔導好像總共就一面,期間一些實現方式和面試官有爭議(沒有沖突)。
一面
手寫 vue 的 mixin 方法
手寫 promise 的 all 方法
現場出了一個移動端的小需求
搜狐-垂直媒體部門(過)
一面
講項目
項目裡面用 nodejs 做了啥
抽取了哪些 vue 組件
二面
講項目
手寫實現 promise
騰訊-地圖(跪)
騰訊兩個部門面試都會先做一套筆試題,筆試題基本就是一些常見的前端問題以及演算法題
三面
講項目,對項目提了一些問題
怎麼判斷一個點是否在圓形內、正方形內
對筆試題
騰訊-天天快報(跪)
也是先做了一套筆試題,但是令人尷尬的是,面試官覺得我快排寫錯了,然而我只是在原地快排沒有申請額外空間…
筆試題
沒了
網路-網路雲(過)
這個部門今年據說升為一級部門了,好像還挺不錯的~
一面
講項目
vue 響應式原理,什麼是 mvvm
es6 使用過的特性
flex 常見的屬性
css 選擇器的優先順序
抽取過哪些 vue 組件
二面
講項目
express 設計原理,面試官對動態路由匹配一直追問下去,但是這里的源碼設計我確實是忘了,一路討論下去扯到了字元串的前綴樹…
實現一個事件發布訂閱類,其實就是 eventEmitter
三面
三面是山大老學長,聊了一些業務上的事情~
搜狗-手機搜狗(過)
搜狗一面的體驗比較差,面試官給人的感覺不太好…
一面
講項目
事件循環
回調函數的壞處
vue 裡面哪兒不會用到雙向綁定
二面
忘了…
快手-商業化(過)
一面
講項目
如何抽取公共組件的
vue 的響應式原理
如何實現一個可設置過期時間的 localStorage
實現一個發布訂閱系統,包括 on、emit、off 等等
二面
一道智力題
軟體工程思想、設計模式等等
async/await 代碼片段,說輸出結果
今日頭條-廣告系統(過)
一面
講項目
講 lazyloader 實現
用 docker 做了什麼
用 webpack 做了什麼
手寫一個演算法題
講 flex
vue 響應式原理
es6
二面
JavaScript 非同步
優化項目
vue 原理,包括計算屬性、依賴收集等等
用 JavaScript 的非同步實現 sleep 函數
演算法題
三面
手寫快排,時間復雜度,優化
手寫實現 jsonp
項目部署,線上問題等等
websocket 握手過程
四面
對 vuex 的理解,單向數據流
設計一個單點登錄的系統,類似阿里系那種
手寫一個演算法
五面
實現一個聯想搜索組件
手寫函數防抖和節流
OPPO 成都研發中心(過)
一面
講項目
講 vue 的 響應式系統,講了好久,從渲染 watcher 到虛擬 dom,面試官還跟我討論了好久
忘了
二面
講項目
忘了
百詞斬(跪)
首先會在線做一道演算法題,挺簡單的,百詞斬感覺掛的稀里糊塗的…
一面
websocket 握手過程
tcp/ip 網路層,http 的特點
http 強行使用 udp 能實現嗎?
vue 原理
webpack 熱更新原理,使用過的插件
原型、閉包、跨域
手寫了一道演算法題
為什麼面這么多公司
因為我是實習直接轉正的,也沒參加過秋招,所以對自己在市場上是個怎樣的實力沒有一個清晰的了解,而且我也想多了解一下其他公司在做什麼,於是就盡量的多面,不過說實話面試確實挺累的。
㈢ 大廠面試題詳解:如何用Redis實現分布式鎖
說一道常見面試題:
一個很簡單的答案就是去使用 Redission 客戶端。Redission 中的鎖方案就是 Redis 分布式鎖得比較完美的詳細方案。
那麼,Redission 中的鎖方案為什麼會比較完美呢?
正好,我用 Redis 做分布式鎖經驗十分豐富,在實際工作中,也 探索 過許多種使用 Redis 做分布式鎖的方案,經過了無數血淚教訓。
所以,在談及 Redission 鎖為什麼比較完美之前,先給大家看看我曾經使用 Redis 做分布式鎖是遇到過的問題。
我曾經用 Redis 做分布式鎖是想去解決一個用戶搶優惠券的問題。這個業務需求是這樣的:當用戶領完一張優惠券後,優惠券的數量必須相應減一,如果優惠券搶光了,就不允許用戶再搶了。
在實現時,先從資料庫中先讀出優惠券的數量進行判斷,當優惠券大於 0,就進行允許領取優惠券,然後,再將優惠券數量減一後,寫回資料庫。
當時由於請求數量比較多,所以,我們使用了三台伺服器去做分流。
這個時候會出現一個問題:
如果其中一台伺服器上的 A 應用獲取到了優惠券的數量之後,由於處理相關業務邏輯,未及時更新資料庫的優惠券數量;在 A 應用處理業務邏輯的時候,另一台伺服器上的 B 應用更新了優惠券數量。那麼,等 A 應用去更新資料庫中優惠券數量時,就會把 B 應用更新的優惠券數量覆蓋掉。
看到這里,可能有人比較奇怪,為什麼這里不直接使用 SQL:
原因是這樣做,在沒有分布式鎖的協調下,優惠券數量可能直接會出現負數。因為當前優惠券數量為 1 的時候,如果兩個用戶通過兩台伺服器同時發起搶優惠券的請求,都滿足優惠券大於 0 每個條件,然後都執行這條 SQL 說了句,結果優惠券數量直接變成 -1 了。
還有人說可以用樂觀鎖,比如使用如下 SQL:
這種方式就在一定幾率下,很可能出現數據一直更新不上,導致長時間重試的情況。
所以,經過綜合考慮,我們就採用了 Redis 分布式鎖,通過互斥的方式,以防止多個客戶端同時更新優惠券數量的方案。
當時,我們首先想到的就是使用 Redis 的 setnx 命令,setnx 命令其實就是 set if not exists 的簡寫。
當 key 設置值成功後,則返回 1,否則就返回 0。所以,這里 setnx 設置成功可以表示成獲取到鎖,如果失敗,則說明已經有鎖,可以被視作獲取鎖失敗。
如果想要釋放鎖,執行任務 del 指令,把 key 刪除即可。
利用這個特性,我們就可以讓系統在執行優惠券邏輯之前,先去 Redis 中執行 setnx 指令。再根據指令執行結果,去判斷是否獲取到鎖。如果獲取到了,就繼續執行業務,執行完再使用 del 指令去釋放鎖。如果沒有獲取到,就等待一定時間,重新再去獲取鎖。
乍一看,這一切沒什麼問題,使用 setnx 指令確實起到了想要的互斥效果。
但是,這是建立在所有運行環境都是正常的情況下的。一旦運行環境出現了異常,問題就出現了。
想一下,持有鎖的應用突然崩潰了,或者所在的伺服器宕機了,會出現什麼情況?
這會造成死鎖——持有鎖的應用無法釋放鎖,其他應用根本也沒有機會再去獲取鎖了。這會造成巨大的線上事故,我們要改進方案,解決這個問題。
怎麼解決呢?咱們可以看到,造成死鎖的根源是,一旦持有鎖的應用出現問題,就不會去釋放鎖。從這個方向思考,可以在 Redis 上給 key 一個過期時間。
這樣的話,即使出現問題,key 也會在一段時間後釋放,是不是就解決了這個問題呢?實際上,大家也確實是這么做的。
不過,由於 setnx 這個指令本身無法設置超時時間,所以一般會採用兩種辦法來做這件事:
1、採用 lua 腳本,在使用 setnx 指令之後,再使用 expire 命令去給 key 設置過期時間。
2、直接使用 set(key,value,NX,EX,timeout) 指令,同時設置鎖和超時時間。
以上兩種方法,使用哪種方式都可以。
釋放鎖的腳本兩種方式都一樣,直接調用 Redis 的 del 指令即可。
到目前為止,我們的鎖既起到了互斥效果,又不會因為某些持有鎖的系統出現問題,導致死鎖了。這樣就完美了嗎?
假設有這樣一種情況,如果一個持有鎖的應用,其持有的時間超過了我們設定的超時時間會怎樣呢?會出現兩種情況:
出現第一種情況比較正常。因為你畢竟執行任務超時了,key 被正常清除也是符合邏輯的。
但是最可怕的是第二種情況,發現設置的 key 還存在。這說明什麼?說明當前存在的 key,是另外的應用設置的。
這時候如果持有鎖超時的應用調用 del 指令去刪除鎖時,就會把別人設置的鎖誤刪除,這會直接導致系統業務出現問題。
所以,為了解決這個問題,我們需要繼續對 Redis 腳本進行改動……毀滅吧,累了……
首先,我們要讓應用在獲取鎖的時候,去設置一個只有應用自己知道的獨一無二的值。
通過這個唯一值,系統在釋放鎖的時候,就能識別出這鎖是不是自己設置的。如果是自己設置的,就釋放鎖,也就是刪除 key;如果不是,則什麼都不做。
腳本如下:
或者
這里,ARGV[1] 是一個可傳入的參數變數,可以傳入唯一值。比如一個只有自己知道的 UUID 的值,或者通過雪球演算法,生成只有自己持有的唯一 ID。
釋放鎖的腳本改成這樣:
可以看到,從業務角度,無論如何,我們的分布式鎖已經可以滿足真正的業務需求了。能互斥,不死鎖,不會誤刪除別人的鎖,只有自己上的鎖,自己可以釋放。
一切都是那麼美好!!!
可惜,還有個隱患,我們並未排除。這個隱患就是 Redis 自身。
要知道,lua 腳本都是用在 Redis 的單例上的。一旦 Redis 本身出現了問題,我們的分布式鎖就沒法用了,分布式鎖沒法用,對業務的正常運行會造成重大影響,這是我們無法接受的。
所以,我們需要把 Redis 搞成高可用的。一般來講,解決 Redis 高可用的問題,都是使用主從集群。
但是搞主從集群,又會引入新的問題。主要問題在於,Redis 的主從數據同步有延遲。這種延遲會產生一個邊界條件:當主機上的 Redis 已經被人建好了鎖,但是鎖數據還未同步到從機時,主機宕了。隨後,從機提升為主機,此時從機上是沒有以前主機設置好的鎖數據的——鎖丟了……丟了……了……
到這里,終於可以介紹 Redission(開源 Redis 客戶端)了,我們來看看它怎麼是實現 Redis 分布式鎖的。
Redission 實現分布式鎖的思想很簡單,無論是主從集群還是 Redis Cluster 集群,它會對集群中的每個 Redis,挨個去執行設置 Redis 鎖的腳本,也就是集群中的每個 Redis 都會包含設置好的鎖數據。
我們通過一個例子來介紹一下。
假設 Redis 集群有 5 台機器,同時根據評估,鎖的超時時間設置成 10 秒比較合適。
第 1 步,咱們先算出集群總的等待時間,集群總的等待時間是 5 秒(鎖的超時時間 10 秒 / 2)。
第 2 步,用 5 秒除以 5 台機器數量,結果是 1 秒。這個 1 秒是連接每台 Redis 可接受的等待時間。
第 3 步,依次連接 5 台 Redis,並執行 lua 腳本設置鎖,然後再做判斷:
再額外多說一句,在很多業務邏輯里,其實對鎖的超時時間是沒有需求的。
比如,凌晨批量執行處理的任務,可能需要分布式鎖保證任務不會被重復執行。此時,任務要執行多長時間是不明確的。如果設置分布式鎖的超時時間在這里,並沒有太大意義。但是,不設置超時時間,又會引發死鎖問題。
所以,解決這種問題的通用辦法是,每個持有鎖的客戶端都啟動一個後台線程,通過執行特定的 lua 腳本,去不斷地刷新 Redis 中的 key 超時時間,使得在任務執行完成前,key 不會被清除掉。
腳本如下:
其中,ARGV[1] 是可傳入的參數變數,表示持有鎖的系統的唯一值,也就是只有持有鎖的客戶端才能刷新 key 的超時時間。
到此為止,一個完整的分布式鎖才算實現完畢。總結實現方案如下:
這個分布式鎖滿足如下四個條件:
當然,在 Redission 中的腳本,為了保證鎖的可重入,又對 lua 腳本做了一定的修改,現在把完整的 lua 腳本貼在下面。
獲取鎖的 lua 腳本:
對應的刷新鎖超時時間的腳本:
對應的釋放鎖的腳本:
到現在為止,使用 Redis 作為分布式鎖的詳細方案就寫完了。
我既寫了一步一坑的坎坷經歷,也寫明了各個問題和解決問題的細節,希望大家看完能有所收獲。
最後再給大家提個醒,使用 Redis 集群做分布式鎖,有一定的爭議性,還需要大家在實際用的時候,根據現實情況,做出更好的選擇和取捨。
原文 https://www.cnblogs.com/siyuanwai/p/16011836.html
㈣ android 面試,演算法題。
final int size = data.length;
for(int i = 0; i< size; i++){
if(data[i] == 0xffffffff)
data[i] = 0x80ffffff;
}
不知道你是不是這個意思。
㈤ java面試演算法題一定考嗎
主要看你面試的公司是什麼類型的公司.外包公司一般考的都是基礎題,要是面試的公司有自己的項目,並且做自己的產品.就有可能考演算法題.但是大部分公司還是不考演算法的.放心吧 .哈哈
㈥ 非計算機專業考華為od演算法題難不難
華為od演算法題難度中下,更傾向於考驗臨場發揮能力。
華為OD的面試首先會有一輪機考,機考是在牛客網上做編程題。總共三道題,據說是一道簡單兩道中等,總分400分,150分以上就算通過。
OD的機考難度不算特別高,如果經常刷牛客和力扣上的題的話,至少及格肯定是沒問題的。考題的偏好的話,基於自己做的和參考其他的OD考試帖子,感覺比較喜歡考數組和字元串的問題,大家刷題可以著重注意一下這種類型的題!
㈦ 刷LeetCode對於國內IT企業面試幫助大嗎
就目前的情況來看,國內公司社招面試中,對於對於演算法的考驗越來越多,很多公司會拿leet code的原題用於面試。
根據我的了解,目前國內的中型廠記下的基本上不會考驗演算法題不會哪一道編程題,讓你手寫指示會咨詢你一些項目經驗,包括一些基礎的資料庫類的知識,或者是編程基礎類知識,比如說你用Java開發怎麼會問你spring cloud的spring boot相關知識,還有一些可能會問你高並發,生產問題處理,linux伺服器命令等等,手撕紅黑樹的情況不多。
對於國內的這些外資企業微軟、蝦皮等等,可能會問一些演算法題,但一般都不會特別難。數據結構問鏈表二叉樹,演算法問動態規劃之類的吧,也是min和easy難度。
對於頭部的大廠可能會出一些hard級別的演算法題,或者是改編過的編程題。目前程序員的人數越來越多,所以未來可能會有更多的公司會通過手撕編程題的方式進行面試。
對於校招來說說來的時候呢,是非常有幫助的,聽不起。各大公司的面試題中都會有演算法題,所以必須要通過刷leetcode來提升自己的。有可能你會遇到一些原題。
不管怎麼樣說演算法題都是很有幫助的,有助於提升編碼能力和邏輯能力,可以讓你的編碼能力一直保持一個不錯的水平,因為很多人平時都是curd小子,很多基礎知識都忘記了包括演算法能力。
leetcode上題很多,逐漸你會發現刷題太耗時間,所以建議採用哈夫曼樹規則。高頻題優先,各個tag刷10題以上掌握典型題總結演算法套路,先把觸手放在能掌握的地方。然後再去重點刷貪心和dp,分類好思路和模板。再去牛客搜公司名刷一些該公司面試題,有個底不至於面試沒見過。建議medium為主,easy和hard為輔。
一零言,聊聊IT,談談技術
㈧ 大公司筆試面試有哪些經典演算法題目
1、二維數組中的查找
具體例題:如果一個數字序列逆置之後跟原序列是一樣的就稱這樣的數字序列為迴文序列。例如:{1, 2, 1}, {15, 78, 78, 15} , {112} 是迴文序列, {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是迴文序列。現在給出一個數字序列,允許使用一種轉換操作:選擇任意兩個相鄰的數,然後從序列移除這兩個數,並用這兩個數字的和插入到這兩個數之前的位置(只插入一個和)。現在對於所給序列要求出最少需要多少次操作可以將其變成迴文序列?
㈨ 阿裡面試官:恕我直言,搞懂這10道演算法題,輕松拿20K不是問題
01打怪獸
難度:容易
現在有3隻怪獸,他們的都有自己的血量a,b,c(1<=a,b,c<=100),當Tom打死第一怪獸的時候花費的代價為0,其餘的怪獸的代價為當前的怪獸的血量減去上一個怪獸的血量的絕對值。問Tom打死這些怪獸所需要的最小代價
02數組變換
難度:中等
給出一個長度為 n 的數組,和一個正整數 d。 你每次可以選擇其中任意一個元素 a[i] 將其變為 a[i] + d 或 a[i] - d,這算作一次操作。你需要將所有的元素全部變成相等元素,如果有解,請輸出最小操作次數,如果無解請輸出-1。
01超級區間
難度:中等
Tom現在有一個長度為n的數組,Jerry給Tom定義了一種超級區間,如果區間[l,r]滿足(a[l]+…+a[r])>=k,則區間[l,r]被稱為超級區間,現在Jerry想讓Tom告訴他數組中有多纖岩少個超級區間。
02能量半徑
難度:中等
codancer來到了一個能量平面上的中心,坐標為(0,0),接下來巫師Tom會在q個坐標上放置能量點,每個信凳能量點的能量值為1,為了打敗哥斯拉,他需要至少k點的能量,因此他想確定一個最小的整數半徑r使得codancer能夠從這個圓心為(0,0),半徑為r的圓形區域內得到至少k個能量值,請你幫他確定最小的整數半徑r。
01找出二叉搜索樹的第2大的數
難度:容易
給定一個二叉搜索樹,找出其第二大的數。
02字元配對
難度:中等
給你一個字元串,字元串中僅包含"A","B",現在有四種字元串"AA","AB","BA","BB",每種字元串都有他們的權值,問從給出的字元串中能夠得到的最大權值為多少(一個字元只能屬於一個子字元串)?
01斐波那契字元串
難度:中等
Tom發現了一種神奇的字元串-斐波那契字元串,定義f[1]=0,f[2]=1,對於所有的i>2都有f[i]=f[i-2]+f[i-1],其中「+」代表拼接,比如01+10=0110,現在對於字元串f[n],請判斷f[n]的第k項是0,還是1?
01Hikari and Interstellar Experience
難度:容易
在無垠的宇宙中,有 n 個星球,第 i 個星球有權值vi 。由於星球之間距離極遠,因此想在有限的時間內在星際間旅行,就必須要在星球間建立傳送通道。 任意兩個星球之間均可以建立傳送通道毀坦御,不過花費並不一樣。 第 i 個星球與第 j 個星球的之間建立傳送通道的花費是lowbit(vi ⊕ vj) ,其中⊕為二進制異或,而lowbit(x)為 x 二進制最低位的值,例如lowbit(5) = 1,lowbit(8) = 8 。 特殊地,lowbit(0) = 0。 Hikari 想在這 n 個星球間穿梭,於是――你需要告訴 Hikari,要使這 n 個星球相互可達,需要的花費最少是多少?
02二進制字元串
難度:中等
Tom得到了一個二進制字元串s,即s只由Ɔ'和Ƈ'組成,現在令d(t)代表二進制字元串t在十進制下的值。 那麼d(「011」)=3,d(「0001000」)=4,如果t的長度等於d(t),那麼就稱t是奇妙串,現在Tom想知道s中有多少個子串是奇妙串?
01小明的數學作業
難度:容易
眾所周知,小明是一個數學小能手,有一天數學老師給了小明一個長度為n(2<=n<=5000)的序列,其中第i個數是ai(0<=ai<=1e9),數學老師想知道這個序列排序後,其中最長的等差子序列的長度是多長,聰明的你能幫小明解決這個問題嗎?
02Codancer上樓
codancer來到了一棟大樓前,現在他要上樓。
如果codancer從第x層走樓梯到第y層(y>x),那麼他所花費的時間是a[x]+a[x+1]+…+a[y];
如果他從x層坐電梯到第y層,那麼他所花費的時間是c+(b[x]+b[x+1]+…+b[y]),因為他等電梯的時間為c。
現在codancer想知道從第1層到第n層需要最少需要多長時間?
01變換的秘鑰
難度:中等
Tom最開始有一個密鑰s1,s1是長度為n的由小寫字母組成的字元串。Jerry也有一個長度為n的由小寫字母組成的密鑰s2。現在有m組關系,每組關系由兩個數字[u,v]構成(1<=u,v<=26),表示26個字母表中的第u個小寫字母可以直接轉換為第v個小寫字母。假設u=1,v=2,那麼說明字母'a'可以直接轉換為字母'b'。現在Tom對於s1的每個字母使用無數次轉換,請判斷s1能否轉換為s2?
01最大邊權和
難度:簡單
現在有n個點(1<=n<=1000),每個點都有一個值稱為點權ai(ai為偶數,1<=ai<=1000),現在可以將任意兩個點相連,連起來以後這條邊也有一個值稱為邊權,這個邊的邊權為這兩個點的點權之和的一半。現在需要你添加n-1條邊,問將這n個點連通以後(連通是指任意兩個點都能互相到達)的最大的邊權和是多少?
02錢庄
難度:中等
錢庄每天能夠收到很多散錢,第i個散錢的值2 wi。為了便於管理,錢庄每天都會向中央銀行申請兌換錢幣,假設錢庄有一些散錢使得2 k1+2 k2+...+2 km=2^x(x為非負整數),那麼就可以將這些散錢兌換成一個大錢幣,問在錢庄收到的這些散錢最終最少能變成幾個錢幣?
01codancer的旅行
難度:困難
期末考試終於結束啦,Codancer開始了他的旅行,現在整個地圖上有n個城市,這些城市之間有n-1條道路相連,每條道路都有一個距離,並且保證整個圖是連通的,即這個地圖可以看作是一棵樹,現在假設Codancer要從城市A到城市B,那麼他的路費就是從A-B的路徑上邊權最大的邊的權值wmaxx元。現在Codancer有k元,他想知道他能選擇那些(A,B)並且A<B使得codancer能夠到達?
HashMap是一個用於存儲Key-Value鍵值對的集合,每一個鍵值對也叫做Entry。這些個鍵值對(Entry)分散存儲在一個數組當中,這個數組就是HashMap的主幹。
01全奇數組
難度:中等
codancer現在有n個正整數a[1],a[2]…a[n],Tom告訴codancer他可以進行下列操作,選擇某個偶數x,把這n個數中全部等於x的數字除2,Tom想知道把這n個數字全部變成奇數最少需要幾次這樣的操作?
以上十道演算法題你都能搞定嘛?備戰大廠每日刷一道演算法題來提升自己,堅持堅持再堅持,必然會有收獲。為大家整理一份781頁的高分寶典,知識較為全面,可分享給想要學習提升自己的朋友。
領取方式:私信【面試寶典】或點擊右方鏈接: https://shimo.im/docs/QVy8HrQgPYkx9Ddg/ 即可免費領取,喜歡本文不妨關注+轉發支持一下~~
㈩ java數據結構書籍推薦
1. 入門級
針對剛入門的同學,建議不要急著去看那些經典書,像《演算法導論》、《演算法》這些比較經典、權威的書。雖然書很好,但看起來很費勁,如果看不完,效果會很不好。所以建議先看兩本入門級的趣味書:
《大話數據結構》
《演算法圖解》
大話數據結構
將理論講的很有趣,不枯燥。作者結合生活中的例子去對每個數據結構和演算法進行講解,讓人通俗易懂。
演算法圖解
這是一本像小說一樣有趣的演算法入門書,書中有大量的圖解,通俗易懂。
看完上面一本或兩本入門級的書,你就會對數據結構和演算法有個大概認識和學習。但這些入門級的書缺少細節、不夠系統。所以想要深入的學習數據結構和演算法,光看這兩本書肯定是不夠的。
2. 不同語言的教科書
國內外很多大學都是將《數據結構和演算法分析》作為教科書。這本書非常系統、嚴謹、全面,難度適中,很適合對數據結構和演算法有些了解,並且已經掌握了至少一門語言的同學學習。針對不同的語言,分別有:
《數據結構與演算法分析:C語言描述》
《數據結構與演算法分析:C++描述》
《數據結構與演算法分析:java語言描述》
如果你不會C、C++、java,會Python或者JavaScript,可以看:
《數據結構與演算法JavaScript描述》
《數據結構與演算法:Python語言描述》
3. 面試書籍
現在很多大廠的面試都會考演算法題,這里推薦幾本面試演算法書籍:
《劍指offer》
《編程珠璣》
《編程之美》
劍指offer
為面試演算法量身定做的一本書。幾乎包含了所有常見的、經典的面試題,如果能搞懂書裡面的內容,一般公司的演算法面試都應該沒問題。
編程珠璣
這本書豆瓣評分有9分,評分很高。這本書最大的特色是講了很多海量數據的處理技巧。其他演算法書籍很少涉及海量數據。
編程之美
有些作者是微軟工程師,演算法題目較難,比較適合要面試Google、Facebook這樣的公司的人去看。
4. 經典書籍
現在數據結構與演算法最經典的書籍就是:
《演算法導論》
《演算法》
《計算機程序設計藝術》
這三本書非常經典,但都很厚,看起來比較費勁,估計很少有人能全部看完。但如果想更深入地學一遍數據結構和演算法,還是建議去看看。
演算法導論
章節安排不是循序漸進,裡面有各種演算法正確性、復雜度的證明、推導,對數學功底有一定要求,看起來有些費勁。
演算法
偏重講演算法。內容不夠全面,對數據結構方面的知識講的不多,動態規劃這么重要的知識點卻沒有講。
計算機程序設計藝術
這本書包括很多卷,相比於其他書籍有更好的深度、廣度、系統性和全面性。但如果你對數據結構和演算法不是特別感興趣,沒有很好的數學、演算法、計算機基礎,很難把這本書讀完、讀懂。
5. 課外閱讀
有些演算法書籍也比較適合在平時悠閑的時候翻翻看看:
《演算法帝國》
《數學之美》
《演算法之美》
這些書都列舉了大量的列子來解釋說明,非常通俗易懂。