好好刷刷算法题,提高自己的编码能力。
leetcode链接:https://leetcode.cn/problems/integer-to-roman/
解题思路: 我们将几种特殊规则,也定义在罗马数字与字符的map中,这样就让所有的规则都变成了从左向右,大的在左,小的在右。每一次都从多往少匹配,只要number大于对应的数值,就匹配上对应的字符串,然后从左往右加起来即可。
另外罗马数字还有很大的数,这道题只要求实现3000以内的数字。
var intToRoman = function (num) {
const romanNumeralMap = {
M: 1000,
CM: 900,
D: 500,
CD: 400,
C: 100,
XC: 90,
L: 50,
XL: 40,
X: 10,
IX: 9,
V: 5,
IV: 4,
I: 1,
};
let result = "";
while (num > 0) {
for (let key in romanNumeralMap) {
if (num >= romanNumeralMap[key]) {
result += key;
console.log(result);
num -= romanNumeralMap[key];
break;
}
}
}
return result;
};
leetcode链接:https://leetcode.cn/problems/roman-to-integer/
解题思路: 我们将几种特殊规则,也定义在罗马数字与字符的map中,这样就让所有的规则都变成了从左向右,大的在左,小的在右。每一次都从多往少匹配,只要字符匹配到了字符串,并且index为0,就将对应的number加上,剩下的字符串再继续从大到小匹配。
/**
* @param {string} s
* @return {number}
*/
var romanToInt = function (s) {
const romanNumeralMap = {
M: 1000,
CM: 900,
D: 500,
CD: 400,
C: 100,
XC: 90,
L: 50,
XL: 40,
X: 10,
IX: 9,
V: 5,
IV: 4,
I: 1,
};
let num = 0;
while (s.length) {
for (let key in romanNumeralMap) {
const index = s.indexOf(key);
if (index === 0) {
s = s.slice(key.length);
num += romanNumeralMap[key];
break;
}
}
}
return num;
};
leetcode链接:https://leetcode.cn/problems/longest-common-prefix/
解题思路:最长公共前缀,顶多是数组里面最短的某个字符串,所以我们先找到最短字符串,然后再依次减少它的长度,去判断是否是数组里面其它元素字符串的前缀,如果最后当最短的字符串长度缩减为1时还不满足,就没有公共前缀。
/**
* @param {string[]} strs
* @return {string}
*/
var longestCommonPrefix = function (strs) {
let minStr = "";
strs.forEach((item) => {
if (!minStr || item.length < minStr.length) {
minStr = item;
}
});
while (minStr) {
const length = minStr.length;
for (const value of strs) {
console.log(value);
if (value.indexOf(minStr) !== 0) {
minStr = minStr.slice(0, minStr.length - 1) || "";
break;
}
}
if (minStr.length < length) {
continue;
} else {
return minStr;
}
}
return "";
};
leetcode链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number/
解题思路:循环回溯。digits的长度就决定了我们要循环多少次,每一次循环的次数,由数字对应的数组长度决定,每循环一次,就判断剩余的digits长度是否为1,如果为1就是最后一次循环,退出递归,否则就继续递归。
/**
* @param {string} digits
* @return {string[]}
*/
var letterCombinations = function (digits) {
let NumberMap = {
2: ["a", "b", "c"],
3: ["d", "e", "f"],
4: ["g", "h", "i"],
5: ["j", "k", "l"],
6: ["m", "n", "o"],
7: ["p", "q", "r", "s"],
8: ["t", "u", "v"],
9: ["w", "x", "y", "z"],
};
let result = [];
function numberToCharCode(ReminDigits = digits, str = "") {
console.log(ReminDigits, str);
if (ReminDigits.length === 1) {
for (const value of NumberMap[ReminDigits]) {
let newStr = str + value;
result.push(newStr);
}
} else if(ReminDigits.length > 1) {
const newReminDigits = ReminDigits.slice(1);
for (const value of NumberMap[ReminDigits[0]]) {
let newStr = str + value;
numberToCharCode(newReminDigits, newStr);
}
}
}
numberToCharCode();
return result;
};