返回信息流
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #93827同步于 2017/8/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖
leetcode:Roman to Integer
dljtgqm
2017/8/21镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
之前看过一个很吊的解法
public class No013 {
public int romanToInt(String str) {
// simulate a HashMap but faster than it.
int[] a = new int[26];
a['I' - 'A'] = 1;
a['V' - 'A'] = 5;
a['X' - 'A'] = 10;
a['L' - 'A'] = 50;
a['C' - 'A'] = 100;
a['D' - 'A'] = 500;
a['M' - 'A'] = 1000;
char prev = 'A';
int sum = 0;
for(char s : str.toCharArray()) {
if(a[s - 'A'] > a[prev - 'A']) {
// if current is greater than the previous, subtract twice.
sum = sum - 2 * a[prev - 'A'];
}
// always add current num to sum.
sum = sum + a[s - 'A'];
prev = s;
}
return sum;
}
}
前几天写过这个题目。当时的想法是:”观看罗马数字构造规则(http://www.jianshu.com/p/0ecc70f62bb7)我们可以发现相邻的两个字符 如果第一个比第二个大 那么第二个字符要么和第三个字符组成(10-1,100-10等组合)要么就是末尾的字符。而第一个字符只要把他带代表的阿拉伯数字加上就可以了。第二个字符可以根据下标i判断是不是末尾字符。”
XIV = 10 + 5 - 1
简单粗暴。
```
func romanToInt(s string) int {
symbol :=[...]string{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}
ret :=0
value := [...]int{ 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 }
for i,j:=0,0;i<len(symbol)&&j<len(s);{
if len(symbol[i]) == 2 && j < len(s)-1 {
if symbol[i][0] == s[j] && symbol[i][1] == s[j+1] {
j +=2
ret += value[i]
}else{
i++
}
continue
}else if len(symbol[i]) == 1{
if symbol[i][0] == s[j] {
j++
ret += value[i]
}else{
i++
}
}else{
i++
}
}
return ret
}
```
def romanToInt(s):
a = ['I', 'V', 'X', 'L', 'C', 'D', 'M']
b = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
res_list = []
res = 0
for i in range(len(s)):
if i == 0 or b[s[i]] < b[s[i - 1]]:
res_list.append(b[s[i]])
else:
while True:
if len(res_list) > 0 and res_list[-1] < b[s[i]]:
res -= res_list.pop()
else:
break
res_list.append(b[s[i]])
for i in res_list:
res += i
return res
话说前天刚刷到。。。这个题是这样的。。。只有IXC三个存在前置做差的情况。。。而且不会有连续两个做差那种(8表示为VIII而不是IIX)不知道我说明白没。。。所以遍历一次就行了,每次和下一个字符比一下就好