給定數(shù)組 [‘1a’,'2b','3c','5a'] 山孔,輸出出現(xiàn)次數(shù)最多的字母前數(shù)字之和: 6坛悉。
// 或許會(huì)有類似這樣 "11ad" 的元素 ? 不會(huì)裸影,每個(gè)元素中只會(huì)有一個(gè)字母,case可作為邊界條件考慮
// let calculateSum = (list = []) => {
// const reg = /^(\d+)([a-zA-Z]+)/;
// let wordMap = new Map();
// for (let i = 0; i < list.length; i++) {
// const item = list[i];
// if (reg.test(item)) {
// const res = reg.exec(item);
// const number = Number(res[1]);
// const word = res[2];
// if (word.length !== 1) {
// console.error(`輸入數(shù)組的第 ${i + 1} 個(gè)數(shù)據(jù)項(xiàng)格式錯(cuò)誤轩猩,請(qǐng)更正!`)
// break;
// }
// const val = wordMap.get(word);
// wordMap.set(word, {
// appearCount: val ? val.appearCount + 1 : 1, // 字母出現(xiàn)次數(shù)
// sumNumber: val ? val.sumNumber + number : number, // 該字母前的數(shù)字之和
// });
// } else {
// console.error(`輸入數(shù)組的第 ${i + 1} 個(gè)數(shù)據(jù)項(xiàng)格式錯(cuò)誤界轩,請(qǐng)更正画饥!`)
// break;
// }
// }
// console.log(wordMap);
// let maxCount = 0, maxSum = 0;
// wordMap.forEach((item) => {
// const { appearCount, sumNumber } = item;
// if (appearCount > maxCount) { // 對(duì)比出現(xiàn)次數(shù)
// maxCount = appearCount;
// maxSum = sumNumber;
// }
// })
// console.log(maxSum);
// return maxSum;
// }
// calculateSum(['1a', '2b', '3c', '5a']);
// 第一次跑失斚挝汀:node 執(zhí)行文件 路徑錯(cuò)誤
// 第二次跑失敗:輸出15抖甘,發(fā)現(xiàn)加和時(shí) 發(fā)生了字符串拼接
// 第三次跑成功:時(shí)間復(fù)雜度 O(2n)热鞍,空間復(fù)雜度 O(n),開始優(yōu)化:
let calculateSum = (list = []) => {
const reg = /^(\d+)([a-zA-Z]+)/;
let wordMap = new Map(), maxCount = 0, maxSum = 0;
for (let i = 0; i < list.length; i++) {
const item = list[i];
if (reg.test(item)) {
const res = reg.exec(item);
const number = Number(res[1]);
const word = res[2];
if (word.length !== 1) {
console.error(`輸入數(shù)組的第 ${i + 1} 個(gè)數(shù)據(jù)項(xiàng)格式錯(cuò)誤薇宠,請(qǐng)更正偷办!`)
break;
}
const val = wordMap.get(word);
wordMap.set(word, {
appearCount: val ? val.appearCount + 1 : 1, // 字母出現(xiàn)次數(shù)
sumNumber: val ? val.sumNumber + number : number, // 該字母前的數(shù)字之和
});
const { appearCount, sumNumber } = wordMap.get(word);
if (appearCount > maxCount) { // 對(duì)比出現(xiàn)次數(shù)
maxCount = appearCount;
maxSum = sumNumber;
}
} else {
console.error(`輸入數(shù)組的第 ${i + 1} 個(gè)數(shù)據(jù)項(xiàng)格式錯(cuò)誤澄港,請(qǐng)更正!`)
break;
}
}
console.log(wordMap);
console.log(maxSum);
return maxSum;
}
calculateSum(['1a', '2b', '3c', '5a']);
// 第四次跑成功:優(yōu)化成功回梧,合并為一次循環(huán)废岂,時(shí)間復(fù)雜度 O(n)狱意,空間復(fù)雜度 O(n)
// 考慮到多個(gè)字母出現(xiàn)次數(shù)相同的case湖苞,如:
calculateSum(['1a', '2b', '3c', '9a', '23b']);
// 該測(cè)試用例中 a 和 b 都出現(xiàn)兩次详囤,輸出了 a 前面的數(shù)字加和。
// 原因是:a先遍歷加和完成藏姐,根據(jù)條件 if (appearCount > maxCount) 會(huì)輸出a的結(jié)果
考慮將空間復(fù)雜度降為 O(1)隆箩?哪位大俠寫出來給留個(gè)言吧羔杨,我實(shí)現(xiàn)不了了??