13.Roman to Integer
本人想法比较简单
class Solution { public int romanToInt(String s) { char arr[] = new char[s.length() + 1];//定义一个一维数组存放数据 for (int i = 0; i < s.length(); i++) {//将输入的字符串遍历一遍 arr[i] = s.charAt(i); } int sum = 0; for (int i = 0; i < s.length(); i++) {//判断一个或者两个罗马数字的所对应的值 并加上去 if (arr[i] == 'M') { sum = sum+1000; } else if (arr[i] == 'C') { if (arr[i + 1] == 'M') { sum = sum+900; i++; } else if (arr[i + 1] == 'D') { sum = sum+400; i++; } else { sum = sum+100; } } else if (arr[i] == 'D') { sum = sum+500; } else if (arr[i] == 'X') { if (arr[i + 1] == 'C') { sum = sum+90; i++; } else if (arr[i + 1] == 'L') { sum = sum+40; i++; } else { sum = sum+10; } } else if (arr[i] == 'L') { sum = sum+50; } else if (arr[i] == 'I') { if (arr[i + 1] == 'X') { sum = sum+9; i++; } else if (arr[i + 1] == 'V') { sum = sum+4; i++; } else { sum = sum+1; } } else if (arr[i] == 'V') { sum =sum +5; } } return sum; } }
其他大神的解法 我一步一步分析
case语句解法
public int romanToInt(String s) { int n = s.length(); int roman_int = 0; for(int i=0;i<n;i++) { switch(s.charAt(i)) //定义一个case 语句块 { case 'I' : roman_int = roman_int + 1;break; case 'V' : roman_int = roman_int + 5;break; case 'X' : roman_int = roman_int + 10;break; case 'L' : roman_int = roman_int + 50;break; case 'C' : roman_int = roman_int + 100;break; case 'D' : roman_int = roman_int + 500;break; case 'M' : roman_int = roman_int + 1000;break; default: System.out.println("default");break; } if(i!=0) { if(((s.charAt(i)=='V')||(s.charAt(i)=='X'))&&(s.charAt(i-1)=='I')) roman_int = roman_int-1*2; if(((s.charAt(i)=='L')||(s.charAt(i)=='C'))&&(s.charAt(i-1)=='X')) roman_int = roman_int-10*2; if(((s.charAt(i)=='D')||(s.charAt(i)=='M'))&&(s.charAt(i-1)=='C')) roman_int = roman_int-100*2; } } return roman_int; }
hash码
class Solution { public int romanToInt(String s) {//制作一个hash表 HashMap map = new HashMap() {{ put('I', 1); put('V', 5); put('X', 10); put('L', 50); put('C', 100); put('D', 500); put('M', 1000); }}; int sum = map.get(s.charAt(s.length() - 1)); for(int i = s.length() - 2; i >= 0; i--) { if(map.get(s.charAt(i)) < map.get(s.charAt(i + 1))) { sum -= map.get(s.charAt(i)); } else { sum += map.get(s.charAt(i)); } } return sum; } }
class Solution {
public int letterToInteger(char letter) {
switch(letter) {
case'I':return 1;
case'V':return 5;
case'X':return 10;
case'L':return 50;
case'C':return 100;
case'D':return 500;
case'M':return 1000;
default:return 0;
}
}
public int romanToInt(String s) { //解析罗马数字
String str = s.toUpperCase();
char[] roman = str.toCharArray();
int all = 0;
int i = 0;
while (true) {
if (i >= roman.length - 1) {
all += letterToInteger(roman[i]);
break;
}
else if (i < roman.length - 1) {
int currentNum = letterToInteger(roman[i]);
int nextNum = letterToInteger(roman[i + 1]); // 越界!!! 仅输入一个 D 报错 已改
if (currentNum >= nextNum) {
all += (currentNum);
i += 1; //一个一个加
} else {
all += (nextNum - currentNum); // 若当前字母比下一个字母小,则下一个字母表示数字减去当前字母表示的数字
i += 2;
}
if (i == roman.length - 1) { // 如果下标已经移动到最后一位字母,那么all直接加上这个字母表示的数字
all += letterToInteger(roman[roman.length - 1]);
break; // 循环结束
}
if (i > roman.length - 1) // 如果下标已经超出字符组范围,循环结束
break;
}
}
return all;
}
}
```