leetcode--integer_to_roman && roman_to_integer

33 篇文章 0 订阅
27 篇文章 0 订阅

leetcode–integer_to_roman && roman_to_integer

题意:给定一个integer,把它转化成罗马数字(本题integer的取值范围是[1, 3999])
tips

罗马数字一共由7个字符构成,分别是I(1),V(5),X(10),L(50),C(100),D(500),M(1000),能够表示的范围刚好就是[1, 3999]。本题求解需要首先了解罗马数字的构成,如1到12分别表示为:Ⅰ、Ⅱ、Ⅲ、Ⅳ、Ⅴ、Ⅵ、Ⅶ、Ⅷ、Ⅸ、Ⅹ、Ⅺ、Ⅻ。罗马数字对照表给出详细的罗马数字表示,读者可以自行查看了解题意。

分析: 本题载了解了罗马数字组合方式的前提下,就不是很难了,只是一个简单的对integer类型数据的处理,通过整除得到千位、十位、个位,例如我们得到个位的数字x,只要将x的值是否满足0、[1, 3]、4、[5, 8]、9几种情况分别讨论即可。

代码
代码写的比较凌乱……还请见谅

public String intToRoman(int num) {
        StringBuffer buffer = new StringBuffer();
        int temp = num/1000;    //表示几千,最大值就是3(本题范围是[1,3999])
        while(temp > 0){
            buffer.append("M");
            temp--;
        }
        num = num % 1000;
        temp = num/100;     //表示千位
        if(temp > 0 && temp < 4){
            while(temp > 0){
                buffer.append("C");
                temp--;
            }
        }else if(temp == 4){
            buffer.append("CD");
        }else if(temp > 4 && temp <= 8){
            buffer.append("D");
            temp -= 5;
            while(temp > 0){
                buffer.append("C");
                temp--;
            }
        }else if(temp == 9){
            buffer.append("CM");
        }

        num = num % 100;

        temp = num / 10;    //表示十位
        if(temp > 0 && temp < 4){
            while(temp > 0){
                buffer.append("X");
                temp--;
            }
        }else if(temp == 4){
            buffer.append("XL");
        }else if(temp > 4 && temp <= 8){
            buffer.append("L");
            temp -= 5;
            while(temp > 0){
                buffer.append("X");
                temp--;
            }
        }else  if(temp == 9){
            buffer.append("XC");
        }

        temp = num % 10;    //表示个位
        if(temp > 0 && temp < 4){
            while(temp > 0){
                buffer.append("I");
                temp--;
            }
        }else if(temp == 4){
            buffer.append("IV");
        }else if(temp > 4 && temp <= 8){
            buffer.append("V");
            temp -= 5;
            while(temp > 0){
                buffer.append("I");
                temp--;
            }
        }else  if(temp == 9){
            buffer.append("IX");
        }
        return buffer.toString();
    }

源程序下载

反之,将罗马数字转换成integer

分析: 将罗马数字转换成integer时只需要着重注意IV,IX,XL,XC,CD,CM这几种情况,其他的直接转换成相应数字即可。

public int romanToInt(String s) {
        int sum = 0;
        for(int i = s.length() - 1; i >= 0; i--){
            if(s.charAt(i) == 'I'){
                sum += 1;
            }else if(s.charAt(i) == 'V'){
                sum += 5;
                if(i-1 >= 0 && s.charAt(i-1) == 'I'){       //IV
                    sum -= 1;
                    i--;
                }
            }else if(s.charAt(i) == 'X'){
                sum += 10;
                if(i-1 >= 0 && s.charAt(i-1) == 'I'){       //IX
                    sum -= 1;
                    i--;
                }
            }else if(s.charAt(i) == 'L'){
                sum += 50;
                if(i-1 >= 0 && s.charAt(i-1) == 'X'){       //XL
                    sum -= 10;
                    i--;
                }
            }else if(s.charAt(i) == 'C'){
                sum += 100;
                if(i-1 >= 0 && s.charAt(i-1) == 'X'){       //XC
                    sum -= 10;
                    i--;
                }
            }else if(s.charAt(i) == 'D'){
                sum += 500;
                if(i-1 >= 0 && s.charAt(i-1) == 'C'){       //CD
                    sum -= 100;
                    i--;
                }
            }else{
                sum += 1000;
                if(i-1 >= 0 && s.charAt(i-1) == 'C'){       //CM
                    sum -= 100;
                    i--;
                }
            } 
        }

        return sum;
    }

源程序下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值