Leetcode简单题:13.罗马数字转整数

正确代码:

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];
            }
        }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值