【问题标题】:Roman Numeral Checker (takes input and checks if a valid roman numeral)(Java)Roman Numeral Checker(接受输入并检查罗马数字是否有效)(Java)
【发布时间】:2014-02-13 02:39:47
【问题描述】:

我需要一些帮助,如果你们想出一些我不知道的方法,请解释一下。

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

或者可以只比较第一个元素和它后面的元素,如果第一个小于第二个,则减去,否则相加。

我确实打算使用数组

供您参考。

M 1000

D 500

C 100

L 50

X 10

V 5

我 1

【问题讨论】:

标签: java roman-numerals


【解决方案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

您可以将所有值放在一个文件中并对其进行解析以填充您的地图。

【讨论】:

  • 你能解释一下吗,我以前从来没有用过这个。我有点明白你的意思,但不知道如何实现它
  • 如果你能引用这个 Map 的 API 那就太棒了。另外,我如何使用它来检查数字是否有效?例如,你只能有 3 个相同值的连续数字,并且不能有 VX 之类的东西
  • LinkedHashMap 是 Java 集合框架的一部分。如果您只将有效条目放入地图(例如实际年份),则可以假设如果地图不包含记录,则输入无效。 (lookup.get("VX") == null;)。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 2016-07-22
    • 2021-04-22
    相关资源
    最近更新 更多