integer-to-roman整数和罗马数字互转java实现

题目描述

请将给出的整数转化为罗马数字

保证输入数字的范围在1 到 3999之间。

罗马数字包含以下七种字符: 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 到 3999 的范围内。

示例 1:

输入: 3
输出: "III"
示例 2:

输入: 4
输出: "IV"
示例 3:

输入: 9
输出: "IX"
示例 4:

输入: 58
输出: "LVIII"
解释: L = 50, V = 5, III = 3.
示例 5:

输入: 1994
输出: "MCMXCIV"
解释: M = 1000, CM = 900, XC = 90, IV = 4.

思路:

用两个数组分别存储数字和罗马字符, 从大到小减,直至为0:

public class Solution {
    public String intToRoman(int num) {
        if(num<1||num>3999)
            return null;
        String res="";
        int[] number={1000,900,500,400,100,90,50,40,10,9,5,4,1};
        String[] str={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
        for(int i=0;i<13;i++){
            while(num>=number[i]){
                res=res+str[i];
                num=num-number[i];
            }
        }
        return res;
    }
}

用switch case逐个遍历,num每次初10直至为0

class Solution {
    public String intToRoman(int num) {
        if(num<1||num>3999){
            return null;
        }
        String str="";
        String temp="";
        int s=num%10;
        int k=num/10;
        for(int i=1;i<=4;i++){
            if(i==1){
                switch(s){
                    case 0:{
                        temp="";
                        break;
                    }
                    case 1:{
                        temp="I";
                        break;
                    }
                    case 2 :{
                        temp="II";
                        break;
                    }
                    case 3:{
                        temp="III";
                        break;
                    }
                    case 4:{
                        temp="IV";
                        break;
                    }
                    case 5:{
                        temp="V";
                        break;
                    }
                    case 6:{
                        temp="VI";
                        break;
                    }
                    case 7:{
                        temp="VII";
                        break;
                    }
                    case 8:{
                        temp="VIII";
                        break;
                    }
                    case 9:{
                        temp="IX";
                        break;
                    }
                }
            }
            else if(i==2){
                switch(s){
                    case 0:{
                        temp="";
                        break;
                    }
                    case 1:{
                        temp="X";
                        break;
                    }
                    case 2:{
                        temp="XX";
                        break;
                    }
                    case 3:{
                        temp="XXX";
                        break;
                    }
                    case 4:{
                        temp="XL";
                        break;
                    }
                    case 5:{
                        temp="L";
                        break;
                    }
                    case 6:{
                        temp="LX";
                        break;
                    }
                    case 7:{
                        temp="LXX";
                        break;
                    }
                    case 8:{
                        temp="LXXX";
                        break;
                    }
                    case 9:{
                        temp="XC";
                        break;
                    }
                }
            }
            else if(i==3){
                switch(s){
                    case 0:{
                        temp="";
                        break;
                    }
                    case 1:{
                        temp="C";
                        break;
                    }
                    case 2:{
                        temp="CC";
                        break;
                    }
                    case 3:{
                        temp="CCC";
                        break;
                    }
                    case 4:{
                        temp="CD";
                        break;
                    }
                    case 5:{
                        temp="D";
                        break;
                    }
                    case 6:{
                        temp="DC";
                        break;
                    }
                    case 7:{
                        temp="DCC";
                        break;
                    }
                    case 8:{
                        temp="DCCC";
                        break;
                    }
                    case 9:{
                        temp="CM";
                        break;
                    }
                }
            }
            else{
                switch(s){
                    case 0:{
                        temp="";
                        break;
                    }
                    case 1:{
                        temp="M";
                        break;
                    }
                    case 2:{
                        temp="MM";
                        break;
                    }
                    case 3:{
                        temp="MMM";
                        break;
                    }
                }
            }
            str=temp+str;
            s=k%10;
            k=k/10;
        }
        return str;
    }
}

题目描述

请将给出的罗马数字转化为整数

保证输入的数字范围在1 到 3999之间。

罗马数字包含以下七种字符: 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 到 3999 的范围内。

示例 1:

输入: "III"
输出: 3
示例 2:

输入: "IV"
输出: 4
示例 3:

输入: "IX"
输出: 9
示例 4:

输入: "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.
示例 5:

输入: "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.

思路:

从大到小遍历所有的罗马字符

public class Solution {
    public int romanToInt(String s) {
        if(s==null)
            return 0;
        int[] number={1000,900,500,400,100,90,50,40,10,9,5,4,1};
        String[] str={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
        int res=0,index=0,end=0;
        for(int i=0;i<str.length;i++){
            String temp=str[i];
            end=index+temp.length();
            while(end<=s.length()&&s.substring(index,end).equals(temp)){
                res=res+number[i];
                index=end;
                end=index+temp.length();
            }
        }
        return res;
    }
}

逐个遍历字符串的每两个字符,若是合法字符则继续,不是合法字符则遍历一个字符

class Solution {
    public int romanToInt(String s) {
        if(s==null){
            return 0;
        }
        int res=0;
        for(int i=0;i<s.length();i++){
            int cur=i;
            String temp="";
            if(i+2<=s.length()){
                temp=s.substring(i,i+2);
            switch(temp){
                case "CM":{
                    res=res+900;
                    i++;
                    break;
                }
                case "CD":{
                    res=res+400;
                    i++;
                    break;
                }
                case "XC":{
                    res=res+90;
                    i++;
                    break;
                }
                case "XL":{
                    res=res+40;
                    i++;
                    break;
                }
                case "IX":{
                    res=res+9;
                    i++;
                    break;
                }
                case "IV":{
                    res=res+4;
                    i++;
                    break;
                }
                default :{
                    break;
                }
            }
            }
            temp=s.substring(i,i+1);
            if(cur==i){
                switch(temp){
                case "M":{
                    res=res+1000;
                    break;
                }
                case "D":{
                    res=res+500;
                    break;
                }
                case "C":{
                    res=res+100;
                    break;
                }
                case "L":{
                    res=res+50;
                    break;
                }
                case "X":{
                    res=res+10;
                    break;
                }
                case "V":{
                    res=res+5;
                    break;
                }
                case "I":{
                    res=res+1;
                    break;
                }
                default :{
                    break;
                }
            }
            }
        }
        return res;
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值