我希望得到一些帮助,如果你们想出一些我不知道的方式,请解释一下。
我确信使用巨大的 IF 或 SWITCH 可以做到这一点,但必须有更优化的方式。我在考虑分配值,然后制定一个算法来检查所有案例。
或者可能只是将第一个元素与它之后的元素进行比较,然后如果第一个小于第二个则减去,否则相加。
我确实计划使用数组
供你参考。
米1000
D 500
C 100
大号 50
X 10
V 5
我 1
我希望得到一些帮助,如果你们想出一些我不知道的方式,请解释一下。
我确信使用巨大的 IF 或 SWITCH 可以做到这一点,但必须有更优化的方式。我在考虑分配值,然后制定一个算法来检查所有案例。
或者可能只是将第一个元素与它之后的元素进行比较,然后如果第一个小于第二个则减去,否则相加。
我确实计划使用数组
供你参考。
米1000
D 500
C 100
大号 50
X 10
V 5
我 1
使用地图,存储所有可能的值,然后查找它们:
Map lookup = new LinkedHashMap<Integer, String>();
lookup.put(10, "X");
lookup.put(11, "XI);
// and so on
Integer year = lookup.get("MMXIV");
System.out.println(year); //prints 2014
您可以将所有值放在一个文件中并对其进行解析以填充您的地图。
const map = {
I: 1,
V: 5,
X: 10,
L: 50,
C: 100,
D: 500,
M: 1000,
};
function isValidRoman(roman) {
const length = roman.length;
let exceptions = 0;
let min = map[roman[0]];
for (let i = 1; i < length; i++) {
const value = map[roman[i]];
if (value > min) {
const isExceptionValid = checkIsExceptionValid(value, min);
if (!isExceptionValid) return false;
else {
exceptions++;
if (exceptions === 2) return false;
}
}
}
return true;
}
function checkIsExceptionValid(value, min) {
if (min === 1) return [5, 10].includes(value);
else if (min === 10) return [50, 100].includes(value);
else if (min === 100) return [500, 1000].includes(value);
return false;
}
const testCases = [
"IXC",
"CDM",
"IXV",
"I",
"X",
"L",
"MMDCL",
"IL",
"XM",
"VX",
"MCMLXXXVII",
];
const expected = [
false,
false,
false,
true,
true,
true,
true,
false,
false,
false,
true,
];
testCases.forEach((testcase, index) => {
console.log(
"result for testcase = ",
testcase,
" = ",
isValidRoman(testcase),
",expected = ",
expected[index]
);
});