LeetCode - 13. Roman to Integer

来源:互联网 发布:js实现继承有哪些方式 编辑:程序博客网 时间:2024/06/10 20:05

题目:

Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999.


思路与步骤:

分两步进行,先对应,再计算。基本思路是:

    首先将 roman 基本字符与阿拉伯数字对应起来,存在一个结构中,然后对输入的字符串逐个字符判断,对应。最后得出最终的阿拉伯数字。

    由于存放 roman-int 的对应结构的选择不同,主要有下面两种不同的思路(每种思路可以有不同的实现方法):

1. 用switch-case语句

  1.1 两个函数

    第一个函数 baseChar() 先取得对应关系,后面直接操作 int 型的 baseChar 即可。

  1.2 一个函数

    比上面多用一个数组。先将字符串 s 中每个字符对应的数字存入 int 数组 nums[ ] 中,后面计算时直接对 nums[] 进行操作即可。

2. 用hashmap

    将 roman 与 int 存入hashmap中。


编程实现:

1. 用switch-case语句

1.1 两个函数

public class Solution {    // method-1: switch-case and two functions    public int baseChar(char c){        int baseInt = 0;        switch(c){            case 'I': baseInt = 1; break;            case 'V': baseInt = 5; break;            case 'X': baseInt = 10; break;            case 'L': baseInt = 50; break;            case 'C': baseInt = 100; break;            case 'D': baseInt = 500; break;            case 'M': baseInt = 1000; break;            default: baseInt = 0;        }        return baseInt;        /* //比上面设置一个baseInt慢        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;            default: return 0;        }*/    }    public int romanToInt(String s) {        int result = 0;        char[] romanChar = s.toCharArray();        int slen = s.length();        for(int i=1; i<slen; i++){            if( baseChar(romanChar[i-1]) < baseChar(romanChar[i]) ) result = result - baseChar(romanChar[i-1]);            else    result = result + baseChar(romanChar[i-1]);        }        result = result + baseChar(romanChar[slen-1]);        return result;    }}

1.2 一个函数

public class Solution {    // method-2: switch-case and one function with array, 比method-1慢    public int romanToInt(String s) {        int result = 0;        int slen = s.length();        int[] num = new int[slen];        char[] romanChar = s.toCharArray();        for(int i=0; i<slen; i++){            switch(romanChar[i]){                case 'I': num[i] = 1; break;                case 'V': num[i] = 5; break;                case 'X': num[i] = 10; break;                case 'L': num[i] = 50; break;                case 'C': num[i] = 100; break;                case 'D': num[i] = 500; break;                case 'M': num[i] = 1000; break;                default: num[i] = 0;            }        }        for(int i=1; i<slen; i++){            if(num[i-1] < num[i])   result = result - num[i-1];            else    result = result + num[i-1];        }        result = result + num[slen-1];        return result;    }}

1.1 比 1.2 快。


2. 用hashmap

public class Solution {    // method-3: using hashmap    public int romanToInt(String s) {        Map<Character, Integer> numsMap = new HashMap<>();        numsMap.put('I', 1);        numsMap.put('V', 5);        numsMap.put('X', 10);        numsMap.put('L', 50);        numsMap.put('C', 100);        numsMap.put('D', 500);        numsMap.put('M', 1000);                int result = 0;        int slen = s.length();        char[] romanChar = s.toCharArray();        for(int i=1; i<slen; i++){            if(numsMap.get(romanChar[i-1]) < numsMap.get(romanChar[i]))                result = result - numsMap.get(romanChar[i-1]);            else    result = result + numsMap.get(romanChar[i-1]);        }        result = result + numsMap.get(romanChar[slen-1]);        return result;    }}

用switch-case语句比hashmap快。

上述方法中,method-1 最快。



0 0
原创粉丝点击