leetcode--integer_to_roman && roman_to_integer

来源:互联网 发布:阿里云 服务器买错了 编辑:程序博客网 时间:2024/05/29 12:36

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
原创粉丝点击