From 2faa3d2dc49e6cfedcfdec77a8058e337f636fe6 Mon Sep 17 00:00:00 2001 From: asahi Date: Sun, 13 Jul 2025 23:39:29 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=88=B7=E9=A2=98roman-to-integer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 13.roman-to-integer.java | 82 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 13.roman-to-integer.java diff --git a/13.roman-to-integer.java b/13.roman-to-integer.java new file mode 100644 index 0000000..3082139 --- /dev/null +++ b/13.roman-to-integer.java @@ -0,0 +1,82 @@ +/* + * @lc app=leetcode id=13 lang=java + * + * [13] Roman to Integer + */ + +// @lc code=start + +import java.util.Arrays; + +class Solution { + public int romanToInt(String s) { + return romanToInt(0, s, 0); + } + + private int romanToInt(int c, String s, int i) { + if(i == s.length()) { + return c; + } + int r; + if(i+1 < s.length() && COMBINED_FORMAT_LIST.contains(s.substring(i, i+2))) { + r = romanToInt(c+getValue(s.substring(i, i+2)), s, i+2); + } else { + r = romanToInt(c+getValue(s.substring(i, i+1)), s, i+1); + } + return r; + } + + private int getValue(String s) { + int r = 0; + switch(s) { + case "IV": + r = 4; + break; + case "IX": + r = 9; + break; + case "XL": + r = 40; + break; + case "XC": + r = 90; + break; + case "CD": + r = 400; + break; + case "CM": + r = 900; + break; + case "I": + r = 1; + break; + case "V": + r = 5; + break; + case "X": + r = 10; + break; + case "L": + r = 50; + break; + case "C": + r = 100; + break; + case "D": + r = 500; + break; + case "M": + r = 1000; + break; + default: + throw new RuntimeException("invalid expr: "+s); + } + return r; + } + + public static final List COMBINED_FORMAT_LIST = Arrays.asList( + "IV","IX", "XL", "XC", "CD", "CM" + ); +} +// @lc code=end +