LeetCode 经典 150 · 可视化

逐步动画、变量流转与五语言代码参考

#12 · 数组 / 字符串

整数转罗马数字

Integer to Roman

测试用例num = 1994
静态推导静态讲解
无需动画

从大到小贪心扣减

  1. 取最大可用值 1000,写入 M。remaining=994
  2. 取 900,写入 CM。remaining=94
  3. 取 90,写入 XC。remaining=4
  4. 取 4,写入 IV。return MCMXCIV
推荐

从大到小贪心扣减

时间 O(1)空间 O(1)

把普通值与减法组合都列出,每次取不超过剩余数字的最大值。

1function intToRoman(num) {2  const pairs = [3    [1000, "M"],4    [900, "CM"],5    [500, "D"],6    [400, "CD"],7    [100, "C"],8    [90, "XC"],9    [50, "L"],10    [40, "XL"],11    [10, "X"],12    [9, "IX"],13    [5, "V"],14    [4, "IV"],15    [1, "I"]16  ];17  let result = "";18  for (const [value, symbol] of pairs)19    while (num >= value) {20      result += symbol;21      num -= value;22    }23  return result;24}
多语言参考

Java · C++ · Go

来源 · CC BY-SA 4.0 ↗

这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。

1class Solution {2    public String intToRoman(int num) {3        List<String> cs4            = List.of("M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I");5        List<Integer> vs = List.of(1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1);6        StringBuilder ans = new StringBuilder();7        for (int i = 0, n = cs.size(); i < n; ++i) {8            while (num >= vs.get(i)) {9                num -= vs.get(i);10                ans.append(cs.get(i));11            }12        }13        return ans.toString();14    }15}
交互式算法学习

从执行步骤真正理解 LeetCode 经典 150

本站整理 150 道高频算法面试题和 302 种解法。动画方法同步展示 JavaScript 与 Python;每题另提供 Java、C++ 与 Go 同题参考实现。

多形态可视化数组、矩阵、DP 表、递归树、树图、链表、栈队列堆、区间和状态机按解法选择。
动画与代码同步当前状态、步骤说明、变量和代码高亮保持一一对应,可逐步播放和回退。
适合面试复习每种方案都给出思路、时间复杂度、空间复杂度、测试用例和 LeetCode 中文原题入口。