0

我希望得到一些帮助,如果你们想出一些我不知道的方式,请解释一下。

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

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

我确实计划使用数组

供你参考。

米1000

D 500

C 100

大号 50

X 10

V 5

我 1

4

2 回答 2

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

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

于 2014-02-13T02:46:52.323 回答
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]
  );
});

于 2021-05-15T11:48:09.753 回答