小哆啦解题记:整数转罗马数字

210 阅读3分钟

小哆啦解题记:整数转罗马数字

小哆啦开始力扣每日一题的第十四天

leetcode.cn/problems/in…

第一章:神秘的任务

一天,哆啦A梦接到了一项任务——将一个整数转换为罗马数字。他心想:“这不就是数字嘛,应该不难!”于是,他兴奋地跑去找小智,请他一起解决这个问题。

“小智,看看这个任务!”哆啦A梦得意地递上任务清单。

小智一看,露出一个“数学怪”式的笑容:“哦,罗马数字啊,这可是一道有趣的题目。我们从最基础的工具开始吧!”

第二章:用 switch 解锁数字

小智从兜里拿出一个工具,笑着说:“这是‘switch’,在一些简单的情况下,它能快速解决问题。我们先用它试试看。”

哆啦A梦好奇地看着,“那我们怎么开始?”

小智示范道:“假设我们有个数字 9,switch 能帮助我们通过多个条件来转换它。”接着,小智展示了代码:

function intToRomanSwitch(num: number): string {
  let result = '';
  switch (true) {
    case num >= 1000:
      result += 'M'.repeat(Math.floor(num / 1000));
      num %= 1000;
    case num >= 900:
      result += 'CM';
      num -= 900;
    case num >= 500:
      result += 'D';
      num -= 500;
    case num >= 400:
      result += 'CD';
      num -= 400;
    case num >= 100:
      result += 'C'.repeat(Math.floor(num / 100));
      num %= 100;
    case num >= 90:
      result += 'XC';
      num -= 90;
    case num >= 50:
      result += 'L';
      num -= 50;
    case num >= 40:
      result += 'XL';
      num -= 40;
    case num >= 10:
      result += 'X'.repeat(Math.floor(num / 10));
      num %= 10;
    case num >= 9:
      result += 'IX';
      num -= 9;
    case num >= 5:
      result += 'V';
      num -= 5;
    case num >= 4:
      result += 'IV';
      num -= 4;
    case num >= 1:
      result += 'I'.repeat(num);
      num -= num;
  }
  return result;
}

console.log(intToRomanSwitch(58));  // LVIII

哆啦A梦看了看:“嗯,switch 处理得不错,但它有点冗长,而且每次都需要写很多条件判断,感觉有些麻烦。”

小智点了点头:“你说得对,switch 在一些简单情况中可以工作,但如果要处理更大的数字,代码会变得越来越复杂,且不容易维护。”

第三章:用 map 提升效率

“那我们该怎么办?”哆啦A梦有些疑惑。

小智微笑着说:“别急,接下来我将给你展示一个更灵活的工具——map。”

哆啦A梦眼睛一亮:“map?它是做什么的?”

小智解释道:“map 可以存储数字和它们对应的罗马数字,我们可以通过查找数字来获取罗马数字,避免了重复的条件判断。”

接着,小智展示了如何使用 map 来简化代码:

function intToRoman(num: number): string {
  const romanMap: Map<number, string> = new Map([
    [1000, 'M'], [900, 'CM'], [500, 'D'], [400, 'CD'],
    [100, 'C'], [90, 'XC'], [50, 'L'], [40, 'XL'],
    [10, 'X'], [9, 'IX'], [5, 'V'], [4, 'IV'], [1, 'I']
  ]);

  let result = '';
  for (const [value, symbol] of romanMap) {
    while (num >= value) {
      result += symbol;
      num -= value;
    }
  }
  return result;
}

console.log(intToRoman(58));  // LVIII

哆啦A梦眼睛一亮:“哇,这个map真是太棒了!只需要查找一下就能得到结果,而且代码也简洁得多。”

小智点了点头:“没错!map 让我们可以轻松地管理数字和罗马数字的关系,代码更加清晰,扩展性也更强。”

第四章:成功的冒险

通过 map,哆啦A梦不仅顺利完成了任务,还学到了如何用合适的工具来解决问题。

哆啦A梦开心地说:“原来,map 真的比 switch 更适合这种任务!它帮助我避免了重复的条件判断,效率也更高。”

小智笑着拍了拍哆啦A梦的背:“你学得很快!选择合适的工具,就能让问题变得简单。记住,不同的问题有不同的解法,找到最合适的才是王道!”