我目前正在学习数据结构& &;LeetCode中的算法。我试着自己解决"罗马到整数"。我尝试创建一个对象,并通过使用for…in来访问key和key的值。我想用console。log检查键和键值但它没有显示任何东西。你能帮我检查一下我漏掉了哪个部分吗?如果我问了一个愚蠢的问题,我很抱歉。我试着自己解决这个问题,但我找不到我做错了几个小时…如果还有其他错误,请告诉我!
这是我到目前为止所做的代码
function romanToNum(s) {
const roman = {
I :1,
IV:4,
V :5,
IV:9,
X :10,
// IL: 49,
L :50,
// IC:99,
C :100,
// ID:499,
D :500,
// IM:999,
M :1000
};
let answer = '';
for(let key in roman){
console.log(key);
console.log(roman[key]);
while (s >= roman[key]) {
answer += key;
s -= roman[key];
}
}
}
看不到任何东西,因为无论何时在for循环块中,对象都是未知的。为了初始化对象并在函数romanToNum
的局部作用域之外查看它,您可以做以下事情:
-
可以全局初始化对象,而不将其封装在函数的局部作用域中;基本上是把romanToNum去掉,因为它什么也做不了。
-
从函数中返回对象并在全局变量中捕获它。
function getObject() {
return roman = {
I :1,
IV:4,
V :5,
IV:9,
X :10,
// IL: 49,
L :50,
// IC:99,
C :100,
// ID:499,
D :500,
// IM:999,
M :1000
};
let roman = getObject();
我不知道你为什么选择这样做,但在我看来,这似乎不是最受欢迎的方法。
您可以尝试学习这段代码。我希望这对你有帮助
/**
* @param {string} s
* @return {number}
*/
var romanToInt = function(s) {
let sum = 0
let checked = []
const stringArr = Array.from(s)
for (let i = 0; i < stringArr.length; i++) {
if(!checked.includes(i)){
let first = romanConverter(stringArr[i])
let second = romanConverter(stringArr[i + 1])
if (first < second) {
sum = sum + (second - first)
checked.push(i)
checked.push(i + 1)
} else {
sum = sum + first
checked.push(i)
}
}
}
return sum
};
let romanConverter = function(s) {
let int
switch (s) {
case 'I':
int = 1;
break;
case 'V':
int = 5;
break;
case 'X':
int = 10;
break;
case 'L':
int = 50;
break;
case 'C':
int = 100;
break;
case 'D':
int = 500;
break;
case 'M':
int = 1000;
break;
default:
int = 0;
break;
}
return int
}
console.log(romanToInt("MCMXCIV"))
罗马数字到整数的转换算法:
将罗马数字字符串拆分为罗马符号(字符)。将每个罗马数字符号转换为它所表示的值。从索引0开始依次取符号:如果符号的当前值大于或等于下一个符号的值,则将该值添加到运行总数中。否则,通过将下一个符号的值添加到运行总数中来减去该值。