LeetCode-Roman to Integer

来源:互联网 发布:联合国数据库中文版 编辑:程序博客网 时间:2024/06/05 18:36

Roman to Integer

Problem:
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
Analysis:
罗马数字有如下符号:

  • 基本字符 I V X L C D M

对应阿拉伯数字

  • 1 5 10 50 100 500 1000

阿拉伯数字—–>罗马数字计数规则:

  • 相同的数字连写,所表示的数等于这些数字相加得到的数,例如:III = 3

  • 小的数字在大的数字右边,所表示的数等于这些数字相加得到的数,例如:VIII = 8

  • 小的数字,限于(I、X和C)在大的数字左边,所表示的数等于大数减去小数所得的数,例如:IV = 4

  • 正常使用时,连续的数字重复不得超过三次在一个数的上面画横线,表示这个数扩大1000倍(本题只考虑3999以内的数,所以用不到这条规则)

其次,罗马数字—–>阿拉伯数字规则(仅限于3999以内):
(如果超过3999则增加DM以及考虑画横线)。
从前向后遍历罗马数字,

  • 如果某个数比前一个数小,则加上该数
  • 反之,减去前一个数的两倍然后加上该数 .(因为开始加了一次所以应该减去2倍)。

【罗马数字举例】
1~9: {“I”, “II”, “III”, “IV”, “V”, “VI”, “VII”, “VIII”, “IX”};
10~90: {“X”, “XX”, “XXX”, “XL”, “L”, “LX”, “LXX”, “LXXX”, “XC”};
100~900: {“C”, “CC”, “CCC”, “CD”, “D”, “DC”, “DCC”, “DCCC”, “CM”};
1000~3000: {“M”, “MM”, “MMM”}.

Anwser1:

public class Solution {    public int romanToInt(String s) {        char cur,pre=s.charAt(0);        int res=charToInt(pre);        for(int i=1;i<s.length();i++){            cur = s.charAt(i);            if(charToInt(pre)>=charToInt(cur)){                res = res + charToInt(cur);            }            else{                res = res - 2 * charToInt(pre) + charToInt(cur);            }            pre = cur;        }        return res;    }    public int charToInt(char c){        int data;        switch (c){            case 'M' :                data=1000;                break;            case 'D' :                data=500;                break;            case 'C' :                data=100;                break;            case 'L' :                data=50;                break;            case 'X' :                data=10;                break;            case 'V' :                data=5;                break;            case 'I':                data=1;                break;            default :                data=0;        }        return data;    }}

代码改进:
Anwser2:

public class Solution {    public int romanToInt(String s) {        int cur,pre;        int res=charToInt(s.charAt(0));        for(int i=1;i<s.length();i++){            pre = charToInt(s.charAt(i-1));            cur = charToInt(s.charAt(i));            if(pre>=cur){                res += cur;            }            else{                res = res - 2 * pre + cur;            }        }        return res;    }    public int charToInt(char c){        switch (c){            case 'M' :                return 1000;            case 'D' :                return 500;            case 'C' :                return 100;            case 'L' :                return 50;            case 'X' :                return 10;            case 'V' :                return 5;            case 'I':                return 1;            default :                return 0;        }    }}

方法1和方法2比较

方法1和方法2思想一样,都是遍历字符串中的每一个字符,如果前一个字符转换为数字大于当前字符转换为的数字则结果加上当前字符转换为的数字,否则减去前一个字符转换为的数字再加上当前字符转换为的数字。
方法2将pre和cur申明为int类型,介绍了中间的char类型,并且在后面的调用中不用再次由char转化为Int类型,减少了计算步骤;还有方法2中的switch直接返回减少了break及data这个变量的赋值过程使代码书写更加简洁

Integer to Roman

Problem:
Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
Analysis:
采用贪心策略,每次选择能表示的最大的值,把对应的字符串连接起来,代码及其简洁。
Anwser:

public class Solution {    public String intToRoman(int num) {        String[] str = new String[] { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };        int[] val = new int[] { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };        StringBuilder res = new StringBuilder();        for(int i=0;i<str.length;i++){            while(num>=val[i]){                num -=val[i];                res.append(str[i]);            }        }        return res.toString();    }}
0 0
原创粉丝点击