Leetcode 13. Roman to Integer & 12. Integer to Roman

来源:互联网 发布:mac root mima 编辑:程序博客网 时间:2024/05/22 11:57

13. Roman to Integer

Total Accepted: 107560 Total Submissions: 254961 Difficulty: Easy

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

Hide Company Tags
 Microsoft Bloomberg Uber Facebook Yahoo
Hide Tags
 Math String
Hide Similar Problems
 (M) Integer to Roman

思路:

参考这里。

从前往后扫描,用一个临时变量记录分段数字。如果当前比前一个大,说明这一段的值应该是当前这个值减去上一个值。比如IV = 5 – 1 代码中从左到右,I已经被加了一次,所以要减去两倍否则,将当前值加入到结果中,然后开始下一段记录。比如VI = 5 + 1, II=1+1
public class Solution { // 7个月前8ms, 现在提交108ms..    public int romanToInt(String s){           char[] ss = s.toCharArray();        int res = convert(ss[0]);        for (int i =1; i<ss.length;i++)        if (convert(ss[i-1]) < convert(ss[i])){            res = res + convert(ss[i]) - 2* convert(ss[i-1]);        }else{            res += convert(ss[i]);        }        return res;    }        int convert(char c){        switch (c){            case 'I': return 1;              case 'V': return 5;            case 'X': return 10;            case 'L': return 50;             case 'C': return 100;             case 'D': return 500;            case 'M': return 1000;        }    return 0;    }}



12. Integer to Roman

Total Accepted: 78984 Total Submissions: 190010 Difficulty: Medium

Given an integer, convert it to a roman numeral.

Input is guaranteed to be within the range from 1 to 3999.

Hide Company Tags
 Twitter
Hide Tags
 Math String
Hide Similar Problems
 (E) Roman to Integer (H) Integer to English Words

思路:

参考这里。

I: 1V: 5X: 10L: 50C: 100D: 500M: 1000字母可以重复,但不超过三次,当需要超过三次时,用与下一位的组合表示:I: 1, II: 2, III: 3, IV: 4C: 100, CC: 200, CCC: 300, CD: 400s = 39783978/1000 = 3: MMM978>(1000-100), 998/900 = 1: CM78<(100-10), 78/50 = 1 :L28<(50-10), 28/10 = XX8<(100-1), 8/5 = 1: V3<(5-1), 3/1 = 3: IIIret = MMMCMLXXVIII所以可以将单个罗马字符扩展成组合形式,来避免需要额外处理类似IX这种特殊情况。I: 1IV: 4V: 5IX: 9X: 10XL: 40L: 50XC: 90C: 100CD: 400D: 500CM: 900M: 1000


解法一:

public class Solution { //     public String intToRoman(int num) {        String[][] table = {            {"","I","II","III","IV","V","VI","VII","VIII","IX"}, // 0-9            {"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"}, // 0,10,20,....,90            {"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"}, // 0,100,200,...,900            {"","M","MM","MMM",}  // 0,1000,2000,3000        };                String res = "";        int digit = 0;        while(num > 0 ){            int remain = num % 10;            res = table[digit][remain] + res;            digit++;            num /= 10;        }        return res;    }}

解法二:

public class Solution {    public String intToRoman(int num) {        StringBuilder sb = new StringBuilder(); // result        String[] str = new String[] { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };        int value[] = {1000,900,500,400, 100, 90,  50, 40,  10, 9, 5, 4, 1};           for(int i=0; num!=0; ++i){             while(num >= value[i]){                 num = num - value[i];                 sb.append(str[i]);             }         }        return sb.toString();    }}


0 0