我想请一些帮助,如果你们想出了我的联盟做法,请解释一下。
我确信有一个巨大的IF或SWITCH我可以做到这一点,但必须有一个更优化的方式。我正在考虑分配值,然后制作一个算法来检查所有情况。
或者只是将第一个元素与之后的元素进行比较,然后减去第一个元素是否小于第二个元素,否则添加。
我打算使用数组
供您参考。
M 1000
D 500
C 100
L 50
X 10
V 5
我1
答案 0 :(得分:0)
使用地图,存储所有可能的值,然后查找它们:
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
您可以将所有值放在文件中并解析它以填充地图。
答案 1 :(得分:0)
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]
);
});