摘要:仔細分析可以發現,字符在這五個數字的英文中,只存在于字符只存在于中,以此類推。
題目描述
繼MIUI8推出手機分身功能,MIUI計劃推出一個電話號碼分身得功能:首先將電話號碼中的每個數字加上8取個位,然后使用對應得大寫字母代替 ("ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE"), 然后隨機打亂這些字母,所生成得字符串即為電話號碼對應得分身。
例子:
輸入 => 輸出
EIGHT => 0
ZEROTWOONE => 234
OHWETENRTEO => 345
OHEWTIEGTHENRTEO => 0345
這道題是輸入一個字符串,映射到一個數字串。
映射題我的習慣是先嘗試用字典的方式做,那么接下來開始做這道題:
10個數字與其英文單詞一一對應,那么這些詞能不能做些文章呢?
我們可以發現,在這十個數字的英文單詞中,字符 Z 只存在于 ZERO,W 只存在于 TWO,以此類推。
所以現在一旦在字符串中發現 Z,我們就可以說存在 0。
我們在這里把 Z 稱作 特征字符, ZERO 稱作 字符值, 0 稱為 數字值
那么,我們可以得到一組映射:
{ Z: ["ZERO", 0], W: ["TWO", 2], U: ["FOUR", 4], X: ["SIX", 6], G: ["EIGHT", 8] }
因此0, 2, 4, 6, 8已經處理好了,現在還剩下 1, 3, 5, 7, 9。
仔細分析可以發現,字符O在這五個數字的英文中,只存在于ONE;字符F只存在于FIVE中,以此類推。
那么,我們又可以得到一組映射:
{ O: ["ONE", 1], T: ["THREE", 3], F: ["FIVE", 5], S: ["SEVEN", 7] }
為什么這里沒有9的映射呢?因為 NINE中N, I, E在 1, 3, 5, 7中都有出現,這里我們就先空著。
注意
這里的兩個映射關系是不可以合并的,想想為什么?
那么這些映射關系有什么用呢?這里就要用到字典(dict)啦。
我們可以把輸入的字符串,轉換為一個字典結構,key 是字符, value 是這個字符在整個字符串中出現的次數。
例如:
"OHEWTIEGTHENRTEO" var dict = { E: 4, T: 3, O: 2, H: 2, I: 1, G: 1, W: 1, N: 1, R: 1 }
然后我們遍歷這個字典:
[{ Z: ["ZERO", 0], W: ["TWO", 2], U: ["FOUR", 4], X: ["SIX", 6], G: ["EIGHT", 8] },{ O: ["ONE", 1], T: ["THREE", 3], F: ["FIVE", 5], S: ["SEVEN", 7] }].map(map => { Object.keys(dict).map(key => { /** 檢查當前字符是否在映射表中 * 在的話檢查字典中當前字符的數量是否仍然大于0 */ map[key] && dict[key] > 0 && /** * 把映射關系中的字面值取出并拆解為一個字符數組, * 遍歷這個字符數組,將字典中該字符的計數減去1,即消化了這個字面值 */ map[key][0].split("").map(char => dict[char] -= 1) && // 把消化的數字值打出來 console.log(map[key][1]) }) }) /** * 2 * 8 * 1 * 3 */
可是題目說明 OHEWTIEGTHENRTEO 的輸出值應該是 0345呀,哪里出錯了呢?
注意題目中的一句話
首先將電話號碼中的每個數字加上8取個位
也就是說,我們打出來的值還需要對這個 加8取個位 進行逆向。
有幾種方法,一是在打印時對 map[key][1] 進行處理:
num => num - 8 >= 0 ? num - 8 : num + 2
或者,我這里用了偷懶的辦法,還記得我們映射表中有個數字值嗎?我人工替換了 :P
[{ Z: ["ZERO", 2], W: ["TWO", 4], U: ["FOUR", 6], X: ["SIX", 8], G: ["EIGHT", 0] },{ O: ["ONE", 3], T: ["THREE", 5], F: ["FIVE", 7], S: ["SEVEN", 9 }].map(map => { Object.keys(dict).map(key => { map[key] && dict[key] > 0 && map[key][0].split("").map(char => dict[char] -= 1) && console.log(map[key][1]) }) }) /** * 4 * 0 * 3 * 5 */
那么現在只需要把輸出值進行一下正序排序即可:
var output = []; [{ Z: ["ZERO", 2], W: ["TWO", 4], U: ["FOUR", 6], X: ["SIX", 8], G: ["EIGHT", 0] },{ O: ["ONE", 3], T: ["THREE", 5], F: ["FIVE", 7], S: ["SEVEN", 9}].map(map => { Object.keys(dict).map(key => { map[key] && dict[key] > 0 && map[key][0].split("").map(char => dict[char] -= 1) && output.push(map[key][1]) }) }) /* * 還記得我們把 9 的處理留空了嗎?現在要補上啦~ * 9 的英文 NINE 你只需要隨意檢查前邊過濾后的字典是否還存在 N I E 任意一個字符即可 * 我選擇的是判斷 E * 輸入的9對應的輸出應該是1,還記得為什么嗎? */ //if (dict["E"] && dict["E"] > 0) output.push(1) /** * 2017.09.19 08:36 更新: * 之前只判斷了是否還存在9,但是忘了多個9同時存在的情況,那么需要做如下改進: */ dist["E"] && // 檢查是否還存在特征字符 E,在經過前面的映射關系過濾后,還剩下幾個E,就還有幾個9 (output = output.concat(Array(dist["E"]).fill(1))) //純js技巧,快速生成指定大小的數組并填充一個值 output.sort() console.log(output) // 0 3 4 5
雖然說本文標題有個 [算法] 前綴,不過這個寫法完全沒考慮什么復雜度之類的東西 ORZ
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/91901.html
摘要:前端日報精選與實現讓你的網站秒配證書借助實現元素滾動自動環繞的劉海大型架構設計騰訊大會圖文筆記中文翻譯種高效縮寫法個人文章個節省開發者時間的實用工具庫與資源簡書通用類和結構與樣式分離眾成翻譯性能調優之調試篇一知乎專欄進階系列 2017-09-19 前端日報 精選 VirtualDOM與diff(Vue實現)讓你的網站秒配 HTTPS 證書借助CSS Shapes實現元素滾動自動環繞iP...
摘要:秋招變夏招,還沒準備好團隊成員收割機牽頭,帶領名成員歷時個月,整理了一份機器學習算法工程師求職面經。但如果之前并沒有意識到這一問題也沒關系,為你呈現一份小而美的面經。這部分內容包含了邏輯題目及概率題目兩方面的內容。 秋招變夏招,還沒準備好?Datawhale團隊成員offer收割機牽頭,帶領14名成員歷時2個月,整理了一份機器學習算法工程師求職面經:Daily-interview。一份...
摘要:好不容易在月號這天中午點左右接到了來自阿里的面試電話。這里會不斷收集和更新基礎相關的面試題,目前已收集題。面試重難點的和的打包過程多線程機制機制系統啟動過程,啟動過程等等掃清面試障礙最新面試經驗分享,此為第一篇,開篇。 2016 年末,騰訊,百度,華為,搜狗和滴滴面試題匯總 2016 年未,騰訊,百度,華為,搜狗和滴滴面試題匯總 各大公司 Java 后端開發面試題總結 各大公司 Jav...
閱讀 777·2023-04-26 03:04
閱讀 2860·2021-11-15 18:10
閱讀 1188·2021-09-03 10:28
閱讀 1126·2019-08-30 15:53
閱讀 877·2019-08-30 12:45
閱讀 1951·2019-08-30 11:03
閱讀 2862·2019-08-29 14:01
閱讀 2925·2019-08-28 18:24