正确代码:
class Solution {
public int romanToInt(String s) {
int[] num=new int[s.length()];
for(int i=0;i<s.length();i++){
switch(s.charAt(i)){
case 'I':
num[i]=1;
break;
case 'V':
num[i]=5;
break;
case 'X':
num[i]=10;
break;
case 'L':
num[i]=50;
break;
case 'C':
num[i]=100;
break;
case 'D':
num[i]=500;
break;
case 'M':
num[i]=1000;
break;
}
}
int sum=0;
for(int i=0;i<num.length;i++){
if((i+1)<num.length){
if(num[i]<num[i+1]){
num[i]=num[i+1]-num[i];
sum=sum+num[i];
i++;
}else{
sum=sum+num[i];
}
}else{
sum=sum+num[i];
}
}
return sum;
}
}
题目分析:
输入字符串输出数字:先遍历数组,将字符与数字对应:
int[] num=new int[s.length()];
for(int i=0;i<s.length();i++){
switch(s.charAt(i)){
case 'I':
num[i]=1;
break;
case 'V':
num[i]=5;
break;
case 'X':
num[i]=10;
break;
case 'L':
num[i]=50;
break;
case 'C':
num[i]=100;
break;
case 'D':
num[i]=500;
break;
case 'M':
num[i]=1000;
break;
}
}
情况分析:两种情况,字符串只有一个字符,字符串有大于等于二的字符。
注意一:为何不能直接写num.length>1:因为下面num[i]会和num[i+1]比较,无法判断(i+1)是否超过了字符串的长度。例如:罗马数字:II ,当i是1时,(i+1)后面没有数据了无法比较,得确保(i+1)在字符串中,否则会报错:string index out of range 3
注意二:为何不能写(i+1)>=num.length:例如:II字符串长度是2,当i=1时,num[i]=1,此时(i+1)=2,可以接着往下进行,但是注意:此时还要进行num[i] 和num[i+1] 比较,但是此时的(i+1)=2,已经超出了字符串索引,此字符串:II索引只有(0,1)。依旧报错:string index out of range 3
if((i+1)>num.length){
}else{
}
特殊情况:一般来说罗马数字大数在左,小数在右:VI=5+1=6,特殊情况小数在左大树在右:IV=5-1=4(大数减小数)。
注意:小数在左大数右时,两个数就看成一个整体,下一次不在遍历,所以多加了一个i++。
int sum=0;
for(int i=0;i<num.length;i++){
if((i+1)<num.length){
if(num[i]<num[i+1]){
num[i]=num[i+1]-num[i];
sum=sum+num[i];
i++;
}else{
sum=sum+num[i];
}
}else{
sum=sum+num[i];
}
}