題目
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
}