leetcode13

leetcode 13 Roman to Integer

解题思路:
分析题目,罗马数字转成整数
先了解罗马数字的技术规则

罗马数字阿拉伯数字
I1
V5
X10
L50
C100
D500
M1000

其中,I,X,C可以连用,也可放在大数的右边连用构成数目(大数字加上小数字),都不能超过三个;放在大数的左边(大数字减去小数字)只能用一个。

  • 初步思路,完全按照计数规则书写
    public int romanToInt(String s) {
        int number = 0;
        int n = s.length();
        for(int i = 0;i<n;i++){
            if(s.charAt(i)=='I'){
                if((i != n-1)&&( s.charAt(i+1)=='V'||s.charAt(i+1)=='X')){
                    number--;
                }else{
                    number++;
                }
            }
            if(s.charAt(i)=='V'){
                number+=5;
            }
            if(s.charAt(i)=='X'){
                if((i != n-1)&&( s.charAt(i+1)=='L'||s.charAt(i+1)=='C')){
                    number-=10;
                }else{
                    number+=10;
                }
            }
            if(s.charAt(i)=='L'){
                number+=50;
            }
            if(s.charAt(i)=='C'){
                if((i != n-1)&&( s.charAt(i+1)=='D'||s.charAt(i+1)=='M')){
                    number-=100;
                }else{
                    number+=100;
                }
            }
            if(s.charAt(i)=='D'){
                number+=500;
            }
            if(s.charAt(i)=='M'){
                number+=1000;
            }
        }
        return number;
    }
  • 再思考思路,将对I,X,C的规则合并处理来看,都是小数字在大数字左边表示减,在大数字右边表示加,合并考虑
    public int romanToInt(String s) {
        int number = 0;
        int n = s.length();
        int[] nums = new int[n];
        for(int i = 0;i<n;i++){
            switch(s.charAt(i)){
            case 'I':
                nums[i] = 1;
                break;
            case 'V':
                nums[i] = 5;
                break;
            case 'X':
                nums[i] = 10;
                break;
            case 'L':
                nums[i] = 50;
                break;
            case 'C':
                nums[i] = 100;
                break;
            case 'D':
                nums[i] = 500;
                break;
            case 'M':
                nums[i] = 1000;
                break;
            }
        }
        for(int i =0;i<n-1;i++){
            if(nums[i]<nums[i+1]){
                number-=nums[i];
            }else{
                number+=nums[i];
            }
        }
        return number+nums[n-1];
    }
  • 再次,符号及所代表数字,可以思考利用map
public int romanToInt(String s) {
        Map<Character,Integer> map = new HashMap<Character,Integer>();
        map.put('I', 1);
        map.put('V', 5);
        map.put('X', 10);
        map.put('L', 50);
        map.put('C', 100);
        map.put('D', 500);
        map.put('M', 1000);

        int number = 0;

        for(int i =0;i<s.length()-1;i++){
            if(map.get(s.charAt(i))<map.get(s.charAt(i+1))){
                number-=map.get(s.charAt(i));
            }else{
                number+=map.get(s.charAt(i));
            }
        }
        return number+map.get(s.charAt(s.length()-1));
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值