罗马数字转整数——乐扣算法题

目录

思路

解题方法

Code代码


/**
题目:
 * 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
 * 字符          数值
 * I             1
 * V             5
 * X             10
 * L             50
 * C             100
 * D             500
 * M             1000
 * 例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。
 * 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。
 * 数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
 *     I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
 *     X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
 *     C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
 * 给定一个罗马数字,将其转换成整数。
 *  */

-----代码在最下面-----

思路

1、首先先分析特殊情况

  • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
  • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
    可以想,正常情况下都是 由大到小排列的,这种特殊情况则是 (左小右大)
    那么如果是左小右大的话,怎么办?看下面这个例子:
    e.g. :
    4 不写做 IIII,而是 IV--->数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4
    看这个例子,能够看出此时的I对应的值为-1,再看一个例子:
    e.g. :
    数字 9 表示为 IX。--->数字 1 在数字 10 的左边,所表示的数等于大数 10 减小数 1 得到的数值 9

2、解决特殊情况

  • 当后面的数小于前面的数时,这时候,后面这个罗马数的值是对应数字的负数
  • 所以我们在得到每一个数后,将他们所有数累加的时候,就要注意,将特殊情况里里面的数换成负数

解题方法

  • 比较数,正常情况下, 前面的大于后面的数
    如果罗马数所对应的数 后面的大于前面的数, 那么后面那个罗马数表现为 对应数字的负数
    把一个小值放在大值的左边,就是做减法,否则为加法。

  • 1、定义一个方法,用来将罗马数转换为数字

  • 2、定义一个数sum来接收转换后的数

  • 3、记录第一个罗马数对应的数字

  • 4、循环字符s ,(注意:要从第二个数开始循环,得到从第二个数到末尾的的每一个数字---(将罗马数转换成数字,调用前面的定义的方法))

  • 5、比较: 后一个数跟前面的一个数比较, 后面的大于前面的,就做减法,否则就做加法。

  • 注意,我们循环是从第二个数开始的,sum累加的话,需要都加上,所以在循环外面还要再加一下。

Code代码

class Solution {
   public static int romanToInt(String s) {
        int sum=0;//用于记录返回数
        int value = Getvalue(s.charAt(0));//为第一个罗马数所对应 的数字
        for (int i = 1; i < s.length(); i++) {
            //循环 从罗马数的第二个数开始:
            int num=Getvalue(s.charAt(i));
            //将罗马数的第二个数和第一个数比较
            if (num > value) {
                //则num这时大于前面的罗马数,那么做减法
                sum-=value;
            }else {
                //则num这时小于前面的罗马数,那么做加法

                sum+=value;
            }
            //让第一个数等于第二个数,第二个数变成第三个数,继续往下比较
            value=num;
        }
        //由于循环是从第二个数开始的,所以最后一个数 I没有加上去,循环完闭在将最后一个数加上去!!!!!

        sum+=value;
        return sum;
    }
    private static int Getvalue(char ch) {
        switch (ch){
            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;
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值