本人想法比较简单
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<Character, Integer> map = new HashMap<Character, Integer>()
{{
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;
}
}