iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 21
0
Software Development

用JS來刷刷HackerRank系列 第 21

(22)HackerRank-Interview-Dictionaries and Hashmaps-Hash Tables: Ransom Note(javaScript ans)

  • 分享至 

  • twitterImage
  •  

題目
Hash Tables: Ransom Note
舉例輸入

6 4
give me one grand today night
give one grand today

舉例輸出

Yes


舉例輸入

6 5
two times three is not four
two times two is four

舉例輸出

No


舉例輸入

7 4
ive got a lovely bunch of coconuts
ive got some coconuts

舉例輸出

No


解析
題旨:歹徒要寫勒索信,但怕字跡被發現不想用手寫,因此想剪雜誌來湊
第一參數為雜誌有的字
第二參數為要拚出的字串

一個字只能用一次,若無法拼出回傳NO
完整拼出回傳YES
那麼我們開始照直覺寫吧

function checkMagazine(magazine, note) {
    //預設結果為可拼完
    let result = true;
    note.some(word => {
        if (!magazine.includes(word)) {
        //發現需求字雜誌沒有跳出迴圈
            result = false;
            return true
        } else {
            //如果有則從雜誌拿掉
             magazine.splice(magazine.indexOf(word), 1);
        }
    });
    console.log(result ? "Yes" : "No") 
}

解析2
感覺跑得有點慢,題目都是Hash Tables了
不如我們先跑一次把它變字典
就可以省去includes的每次遍歷了

function checkMagazine(magazine, note) {
    let result = true;
    //把magzine變成字典,且計算字典資源數量
    let wordbook = toWordBook(magazine,' ')
    //鎖定字典不允許增加字
    Object.preventExtensions(wordbook)
    note.forEach(word => {
        //如果沒有這個字,或已經被使用光則跳出
        if (wordbook[word] == undefined || wordbook[word] == 0) {
            result = false;
            return false;
        } else {
            wordbook[word] = wordbook[word] - 1;
        }
    });
    console.log(result ? "Yes" : "No")
}

function toWordBook(source,str) {
    let sArr = Array.isArray(source) ? source : source.split(' ');
    let wordBook={}
    sArr.forEach(word => {
        wordBook[word] = wordBook[word] ? wordBook[word] + 1 : 1;
    });
    return wordBook
}

上一篇
(21)HackerRank-Interview-Arrays-Left Rotation(javaScript ans)
下一篇
(23)HackerRank-Interview-Arrays-New Year Chaos(javaScript ans)
系列文
用JS來刷刷HackerRank29
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言