[leetcode] Roman to Integer
与えられたローマ数字文字列を整数に変換する問題.
ローマ数字ごとに次の値が表示されます.
ローマ数字I 1 V 5 X 10 L 50 C 100 D 500 M 1000
そして、問題点から見ると、次のような条件があります.
I can be placed before V (5) and X (10) to make 4 and 9.
X can be placed before L (50) and C (100) to make 40 and 90.
C can be placed before D (500) and M (1000) to make 400 and 900.
すなわち,VIIが7,IVが4であると仮定すると,小さな数字が大きな数字の前に現れると,マイナス記号の役割を果たす.
例えば、LXは60であるが、XLは40まで読み取ることができる.
この問題に対して,HashMapには各文字が表す数字がマッピングされ,前ローマ数字が後ローマ文字より大きい場合には,小さい場合に応じて符号を変更して加算する形で解く.
ローマ数字ごとに次の値が表示されます.
ローマ数字I 1 V 5 X 10 L 50 C 100 D 500 M 1000
そして、問題点から見ると、次のような条件があります.
I can be placed before V (5) and X (10) to make 4 and 9.
X can be placed before L (50) and C (100) to make 40 and 90.
C can be placed before D (500) and M (1000) to make 400 and 900.
すなわち,VIIが7,IVが4であると仮定すると,小さな数字が大きな数字の前に現れると,マイナス記号の役割を果たす.
例えば、LXは60であるが、XLは40まで読み取ることができる.
この問題に対して,HashMapには各文字が表す数字がマッピングされ,前ローマ数字が後ローマ文字より大きい場合には,小さい場合に応じて符号を変更して加算する形で解く.
class Solution {
public int romanToInt(String s) {
Map<String, Integer> romans = new HashMap<>();
romans.put("I", 1);
romans.put("V", 5);
romans.put("X", 10);
romans.put("L", 50);
romans.put("C", 100);
romans.put("D", 500);
romans.put("M", 1000);
String[] strs = s.split("");
int result = romans.get(strs[strs.length-1]);
int sign = 1;
for(int i = strs.length-1; i>0; i--) {
int now = romans.get(strs[i]);
int next = romans.get(strs[i-1]);
if(now > next) {
sign = -1;
} else if(now < next) {
sign = 1;
}
result+=next*sign;
}
return result;
}
}
Reference
この問題について([leetcode] Roman to Integer), 我々は、より多くの情報をここで見つけました https://velog.io/@spark805/Roman-to-Integerテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol