成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

[算法] 電話號(hào)碼分身 (小米2017 秋招真題)[JavaScript]

ivan_qhz / 896人閱讀

摘要:仔細(xì)分析可以發(fā)現(xiàn),字符在這五個(gè)數(shù)字的英文中,只存在于字符只存在于中,以此類(lèi)推。

題目描述

繼MIUI8推出手機(jī)分身功能,MIUI計(jì)劃推出一個(gè)電話號(hào)碼分身得功能:首先將電話號(hào)碼中的每個(gè)數(shù)字加上8取個(gè)位,然后使用對(duì)應(yīng)得大寫(xiě)字母代替 ("ZERO", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE"), 然后隨機(jī)打亂這些字母,所生成得字符串即為電話號(hào)碼對(duì)應(yīng)得分身。

例子:
輸入 => 輸出
EIGHT => 0
ZEROTWOONE => 234
OHWETENRTEO => 345
OHEWTIEGTHENRTEO => 0345

這道題是輸入一個(gè)字符串,映射到一個(gè)數(shù)字串。
映射題我的習(xí)慣是先嘗試用字典的方式做,那么接下來(lái)開(kāi)始做這道題:

10個(gè)數(shù)字與其英文單詞一一對(duì)應(yīng),那么這些詞能不能做些文章呢?

我們可以發(fā)現(xiàn),在這十個(gè)數(shù)字的英文單詞中,字符 Z 只存在于 ZERO,W 只存在于 TWO,以此類(lèi)推。
所以現(xiàn)在一旦在字符串中發(fā)現(xiàn) Z,我們就可以說(shuō)存在 0。
我們?cè)谶@里把 Z 稱作 特征字符, ZERO 稱作 字符值, 0 稱為 數(shù)字值
那么,我們可以得到一組映射:

{
    Z: ["ZERO", 0],
    W: ["TWO", 2],
    U: ["FOUR", 4],
    X: ["SIX", 6],
    G: ["EIGHT", 8]
}

因此0, 2, 4, 6, 8已經(jīng)處理好了,現(xiàn)在還剩下 1, 3, 5, 7, 9。
仔細(xì)分析可以發(fā)現(xiàn),字符O在這五個(gè)數(shù)字的英文中,只存在于ONE;字符F只存在于FIVE中,以此類(lèi)推。
那么,我們又可以得到一組映射:

{
    O: ["ONE", 1],
    T: ["THREE", 3],
    F: ["FIVE", 5],
    S: ["SEVEN", 7]
}

為什么這里沒(méi)有9的映射呢?因?yàn)?NINEN, I, E1, 3, 5, 7中都有出現(xiàn),這里我們就先空著。

注意
這里的兩個(gè)映射關(guān)系是不可以合并的,想想為什么?

那么這些映射關(guān)系有什么用呢?這里就要用到字典(dict)啦。
我們可以把輸入的字符串,轉(zhuǎn)換為一個(gè)字典結(jié)構(gòu),key 是字符, value 是這個(gè)字符在整個(gè)字符串中出現(xiàn)的次數(shù)。

例如:

"OHEWTIEGTHENRTEO"

var dict = {
    E: 4,
    T: 3,
    O: 2,
    H: 2,
    I: 1,
    G: 1,
    W: 1,
    N: 1,
    R: 1
}

然后我們遍歷這個(gè)字典:

[{
    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 => {
        /** 檢查當(dāng)前字符是否在映射表中
         * 在的話檢查字典中當(dāng)前字符的數(shù)量是否仍然大于0
         */
        map[key] && dict[key] > 0 &&
        /**
         * 把映射關(guān)系中的字面值取出并拆解為一個(gè)字符數(shù)組,
         * 遍歷這個(gè)字符數(shù)組,將字典中該字符的計(jì)數(shù)減去1,即消化了這個(gè)字面值
         */
        map[key][0].split("").map(char => dict[char] -= 1) &&
        // 把消化的數(shù)字值打出來(lái)
        console.log(map[key][1])
    })
})

/**
 * 2
 * 8
 * 1
 * 3
 */

可是題目說(shuō)明 OHEWTIEGTHENRTEO 的輸出值應(yīng)該是 0345呀,哪里出錯(cuò)了呢?

注意題目中的一句話

首先將電話號(hào)碼中的每個(gè)數(shù)字加上8取個(gè)位

也就是說(shuō),我們打出來(lái)的值還需要對(duì)這個(gè) 加8取個(gè)位 進(jìn)行逆向。
有幾種方法,一是在打印時(shí)對(duì) map[key][1] 進(jìn)行處理:

num => num - 8 >= 0 ? num - 8 : num + 2

或者,我這里用了偷懶的辦法,還記得我們映射表中有個(gè)數(shù)字值嗎?我人工替換了 :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
 */

那么現(xiàn)在只需要把輸出值進(jìn)行一下正序排序即可:

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 的處理留空了嗎?現(xiàn)在要補(bǔ)上啦~
 * 9 的英文 NINE 你只需要隨意檢查前邊過(guò)濾后的字典是否還存在 N I E 任意一個(gè)字符即可
 * 我選擇的是判斷 E
 * 輸入的9對(duì)應(yīng)的輸出應(yīng)該是1,還記得為什么嗎?
 */
//if (dict["E"] && dict["E"] > 0) output.push(1)

/**
 * 2017.09.19 08:36 更新:
 * 之前只判斷了是否還存在9,但是忘了多個(gè)9同時(shí)存在的情況,那么需要做如下改進(jìn):
 */
 dist["E"] && // 檢查是否還存在特征字符 E,在經(jīng)過(guò)前面的映射關(guān)系過(guò)濾后,還剩下幾個(gè)E,就還有幾個(gè)9
 (output = output.concat(Array(dist["E"]).fill(1))) //純js技巧,快速生成指定大小的數(shù)組并填充一個(gè)值

output.sort()
console.log(output) // 0 3 4 5

雖然說(shuō)本文標(biāo)題有個(gè) [算法] 前綴,不過(guò)這個(gè)寫(xiě)法完全沒(méi)考慮什么復(fù)雜度之類(lèi)的東西 ORZ

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/91901.html

相關(guān)文章

  • 2017-09-19 前端日?qǐng)?bào)

    摘要:前端日?qǐng)?bào)精選與實(shí)現(xiàn)讓你的網(wǎng)站秒配證書(shū)借助實(shí)現(xiàn)元素滾動(dòng)自動(dòng)環(huán)繞的劉海大型架構(gòu)設(shè)計(jì)騰訊大會(huì)圖文筆記中文翻譯種高效縮寫(xiě)法個(gè)人文章個(gè)節(jié)省開(kāi)發(fā)者時(shí)間的實(shí)用工具庫(kù)與資源簡(jiǎn)書(shū)通用類(lèi)和結(jié)構(gòu)與樣式分離眾成翻譯性能調(diào)優(yōu)之調(diào)試篇一知乎專(zhuān)欄進(jìn)階系列 2017-09-19 前端日?qǐng)?bào) 精選 VirtualDOM與diff(Vue實(shí)現(xiàn))讓你的網(wǎng)站秒配 HTTPS 證書(shū)借助CSS Shapes實(shí)現(xiàn)元素滾動(dòng)自動(dòng)環(huán)繞iP...

    Leo_chen 評(píng)論0 收藏0
  • 求職攻略 | Datawhale助力秋招最強(qiáng)戰(zhàn)甲

    摘要:秋招變夏招,還沒(méi)準(zhǔn)備好團(tuán)隊(duì)成員收割機(jī)牽頭,帶領(lǐng)名成員歷時(shí)個(gè)月,整理了一份機(jī)器學(xué)習(xí)算法工程師求職面經(jīng)。但如果之前并沒(méi)有意識(shí)到這一問(wèn)題也沒(méi)關(guān)系,為你呈現(xiàn)一份小而美的面經(jīng)。這部分內(nèi)容包含了邏輯題目及概率題目?jī)煞矫娴膬?nèi)容。 秋招變夏招,還沒(méi)準(zhǔn)備好?Datawhale團(tuán)隊(duì)成員offer收割機(jī)牽頭,帶領(lǐng)14名成員歷時(shí)2個(gè)月,整理了一份機(jī)器學(xué)習(xí)算法工程師求職面經(jīng):Daily-interview。一份...

    CKJOKER 評(píng)論0 收藏0
  • Android-Java面試

    摘要:好不容易在月號(hào)這天中午點(diǎn)左右接到了來(lái)自阿里的面試電話。這里會(huì)不斷收集和更新基礎(chǔ)相關(guān)的面試題,目前已收集題。面試重難點(diǎn)的和的打包過(guò)程多線程機(jī)制機(jī)制系統(tǒng)啟動(dòng)過(guò)程,啟動(dòng)過(guò)程等等掃清面試障礙最新面試經(jīng)驗(yàn)分享,此為第一篇,開(kāi)篇。 2016 年末,騰訊,百度,華為,搜狗和滴滴面試題匯總 2016 年未,騰訊,百度,華為,搜狗和滴滴面試題匯總 各大公司 Java 后端開(kāi)發(fā)面試題總結(jié) 各大公司 Jav...

    TalkingData 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<