罗马数字检查器(接受输入并检查是否有效的罗马数字)(Java)

时间:2014-02-13 02:39:47

标签: java roman-numerals

我想请一些帮助,如果你们想出了我的联盟做法,请解释一下。

我确信有一个巨大的IF或SWITCH我可以做到这一点,但必须有一个更优化的方式。我正在考虑分配值,然后制作一个算法来检查所有情况。

或者只是将第一个元素与之后的元素进行比较,然后减去第一个元素是否小于第二个元素,否则添加。

我打算使用数组

供您参考。

M 1000

D 500

C 100

L 50

X 10

V 5

我1

2 个答案:

答案 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]
  );
});