JS中的罗马到整数为什么它只转换第一个字符
Roman to Integer in JS why it only convert the first character
我尝试解决Leedcode问题13,问题是给定一个罗马数字,将其转换为整数。(输入保证在1到3999的范围内。)
这是我下面的代码,我想知道为什么它只将罗马数字中的第一个字符转换为整数?
var romanToInt = function(s) {
var result = 0;
if (s == null) {
result = 0;
}
var myMap = new Map();
myMap.set('I', 1);
myMap.set('V', 5);
myMap.set('X', 10);
myMap.set('L', 50);
myMap.set('C', 100);
myMap.set('D', 500);
myMap.set('M', 1000);
var len = s.length;
for (var i = 0; i < len; i++) {
if (myMap.get(s.charAt(i)) < myMap.get(s.charAt(i + 1))) {
result -= myMap.get(s.charAt(i))
} else {
result += myMap.get(s.charAt(i))
}
return result;
};
}
console.log(romanToInt('VI'));
console.log(romanToInt('V'));
console.log(romanToInt('VII'));
因为
return result;
循环结束一次。将其向下移动一行。如果你能正确格式化,你就不会犯这样的错误;)
const values = new Map([
['I', 1],
['V', 5],
['X', 10]
/*....*/
]);
function romanToInt(string) {
let result = 0,
current, previous = 0;
for (const char of string.split("").reverse()) {
current = values.get(char);
if (current >= previous) {
result += current;
} else {
result -= current;
}
previous = current;
}
return result;
}
console.log(romanToInt('I'));
console.log(romanToInt('II'));
console.log(romanToInt('III'));
console.log(romanToInt('IV'));
console.log(romanToInt('V'));
console.log(romanToInt('VI'));
console.log(romanToInt('VII'));
console.log(romanToInt('VIII'));
console.log(romanToInt('IX'));
console.log(romanToInt('X'));
console.log(romanToInt('XI'));
console.log(romanToInt('XII'));
console.log(romanToInt('XIII'));
console.log(romanToInt('XIV'));
console.log(romanToInt('XV'));
console.log(romanToInt('XVI'));
console.log(romanToInt('XVII'));
console.log(romanToInt('XVIII'));
console.log(romanToInt('XIX'));
console.log(romanToInt('XX'));
因为你的return result;
是内循环,只需将return result;
移到外循环即可。
以下是您代码的简化(可读性)版本。
const myMap=new Map();
myMap.set('I', 1);
myMap.set('V', 5);
myMap.set('X', 10);
myMap.set('L', 50);
myMap.set('C', 100);
myMap.set('D', 500);
myMap.set('M', 1000);
var romanToInt = function(s) {
var result=0;
if(s){
var s1=s.split('');
s1.forEach(function(e,i){
result += myMap.get(e) < myMap.get(s1[i+1]) ? -myMap.get(e) : myMap.get(e); // used ternary oprator with '-' where required
});
}
return result; //move it outside loop
}
console.log(romanToInt('IV'));
console.log(romanToInt('V'));
console.log(romanToInt('VII'));
也许你可以试试 :
function romanToInt(romanString) {
if(typeof romanString !== 'string') return NaN;
const romanRegExp = /^(?=[MDCLXVI])(M*)(?:(C)(?:(D)|(M))|(D?)(C{0,3}))(?:(X)(?:(L)|(C))|(L?)(X{0,3}))(?:(I)(?:(V)|(X))|(V?)(I{0,3}))$/i;
let parts = romanString.match(romanRegExp);
if(!parts) return NaN;
let result = 0;
[0, 1000, -100,500,1000,500,100, -10,50,100,50,10, -1,5,10,5,1].forEach(
(weight, i) => result += weight * (parts[i] || '').length
);
return result;
}
console.log(romanToInt('IV'));
console.log(romanToInt('MMXIX'));
试试这个。它应该有效:
<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false">
<div class="snippet-code">
<pre><code>function conversion(r) {
const arr = r.split('');
const val = {
I: 1,
V: 5,
X: 10,
L: 50,
C: 100,
D: 500,
M: 1000,
};
let sum = 0;
for (let i = 0; i < arr.length; i += 1) {
if (val[arr[i]] < val[arr[i + 1]]) {
sum += val[arr[i + 1]] - val[arr[i]];
i += 1;
} else {
sum += val[arr[i]];
}
} return sum;
}
console.log(conversion("VIII"));
console.log(conversion("LXXIX"));
console.log(conversion("MCMXLIV"));
我尝试解决Leedcode问题13,问题是给定一个罗马数字,将其转换为整数。(输入保证在1到3999的范围内。) 这是我下面的代码,我想知道为什么它只将罗马数字中的第一个字符转换为整数?
var romanToInt = function(s) {
var result = 0;
if (s == null) {
result = 0;
}
var myMap = new Map();
myMap.set('I', 1);
myMap.set('V', 5);
myMap.set('X', 10);
myMap.set('L', 50);
myMap.set('C', 100);
myMap.set('D', 500);
myMap.set('M', 1000);
var len = s.length;
for (var i = 0; i < len; i++) {
if (myMap.get(s.charAt(i)) < myMap.get(s.charAt(i + 1))) {
result -= myMap.get(s.charAt(i))
} else {
result += myMap.get(s.charAt(i))
}
return result;
};
}
console.log(romanToInt('VI'));
console.log(romanToInt('V'));
console.log(romanToInt('VII'));
因为
return result;
循环结束一次。将其向下移动一行。如果你能正确格式化,你就不会犯这样的错误;)
const values = new Map([
['I', 1],
['V', 5],
['X', 10]
/*....*/
]);
function romanToInt(string) {
let result = 0,
current, previous = 0;
for (const char of string.split("").reverse()) {
current = values.get(char);
if (current >= previous) {
result += current;
} else {
result -= current;
}
previous = current;
}
return result;
}
console.log(romanToInt('I'));
console.log(romanToInt('II'));
console.log(romanToInt('III'));
console.log(romanToInt('IV'));
console.log(romanToInt('V'));
console.log(romanToInt('VI'));
console.log(romanToInt('VII'));
console.log(romanToInt('VIII'));
console.log(romanToInt('IX'));
console.log(romanToInt('X'));
console.log(romanToInt('XI'));
console.log(romanToInt('XII'));
console.log(romanToInt('XIII'));
console.log(romanToInt('XIV'));
console.log(romanToInt('XV'));
console.log(romanToInt('XVI'));
console.log(romanToInt('XVII'));
console.log(romanToInt('XVIII'));
console.log(romanToInt('XIX'));
console.log(romanToInt('XX'));
因为你的return result;
是内循环,只需将return result;
移到外循环即可。
以下是您代码的简化(可读性)版本。
const myMap=new Map();
myMap.set('I', 1);
myMap.set('V', 5);
myMap.set('X', 10);
myMap.set('L', 50);
myMap.set('C', 100);
myMap.set('D', 500);
myMap.set('M', 1000);
var romanToInt = function(s) {
var result=0;
if(s){
var s1=s.split('');
s1.forEach(function(e,i){
result += myMap.get(e) < myMap.get(s1[i+1]) ? -myMap.get(e) : myMap.get(e); // used ternary oprator with '-' where required
});
}
return result; //move it outside loop
}
console.log(romanToInt('IV'));
console.log(romanToInt('V'));
console.log(romanToInt('VII'));
也许你可以试试 :
function romanToInt(romanString) {
if(typeof romanString !== 'string') return NaN;
const romanRegExp = /^(?=[MDCLXVI])(M*)(?:(C)(?:(D)|(M))|(D?)(C{0,3}))(?:(X)(?:(L)|(C))|(L?)(X{0,3}))(?:(I)(?:(V)|(X))|(V?)(I{0,3}))$/i;
let parts = romanString.match(romanRegExp);
if(!parts) return NaN;
let result = 0;
[0, 1000, -100,500,1000,500,100, -10,50,100,50,10, -1,5,10,5,1].forEach(
(weight, i) => result += weight * (parts[i] || '').length
);
return result;
}
console.log(romanToInt('IV'));
console.log(romanToInt('MMXIX'));
试试这个。它应该有效:
<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false">
<div class="snippet-code">
<pre><code>function conversion(r) {
const arr = r.split('');
const val = {
I: 1,
V: 5,
X: 10,
L: 50,
C: 100,
D: 500,
M: 1000,
};
let sum = 0;
for (let i = 0; i < arr.length; i += 1) {
if (val[arr[i]] < val[arr[i + 1]]) {
sum += val[arr[i + 1]] - val[arr[i]];
i += 1;
} else {
sum += val[arr[i]];
}
} return sum;
}
console.log(conversion("VIII"));
console.log(conversion("LXXIX"));
console.log(conversion("MCMXLIV"));