leetcode 13 罗马数字转10进制

来源:互联网 发布:打开本机端口 编辑:程序博客网 时间:2024/05/16 00:58

leetcode 13 罗马数字转10进制

今天是第一天开刷leetcode。知道了QJ神马玩意 ^^… .感觉自己算法简直弱爆了,小学生都可以吊打。事实就是这样,但有颗不服气的心,一直想去提高自己的算法水平,但又不知道何从下手,于是乎丛刷题开始,由点及面,总会有提高的^^。也不知道刷完了的感觉会是怎么样的,算法水平到底会提高到如何程度, 是葵花宝典 ,还是辟邪剑谱。这几个月会努力刷题。

思路:
1:了解罗马数字。这题是罗马数字到10进制的转换。看到这题我得思路是先去了解罗马数字的规则。每个罗马数字的含义和组数规则。
2:数据结构。如何把罗马数字和10进制对应起来。
3:算法部分基于的逻辑。如果左边的数大于等于右边的数,和=左边+右边。反之 和=左边-右边。

上代码:

static int romanToInt(String s)    {        Map<Character,Integer> map =new HashMap<Character,Integer>();        map.put('I', 1);        map.put('V', 5);        map.put('X', 10);        map.put('L', 50);        map.put('C', 100);        map.put('D', 500);        map.put('M', 1000);        char[] charArray = s.toCharArray();        int sum=0;        for(int i=charArray.length-1;i>=0;i--)        {          char c1 = charArray[i];          //考虑到第一个数字会越界做处理          int tmp=i+1>charArray.length-1?charArray.length-1:i+1;          char c2=charArray[tmp];          //左边>=右边          if(map.get(c1)>=map.get(c2))          {          sum+=map.get(c1);          }else           {              sum-=map.get(c1);          }        }        return sum;    }

其他解法。。
→_→
看了别人的做法 switch case 。

static int romanToIntV2(String s) {    char[] charArray = s.toCharArray();    int sum = 0;    // 记录之前的数字    int pre = -1;    int curNum = -1;    for (int i = charArray.length - 1; i >= 0; i--) {        char c1 = charArray[i];        switch (c1) {        case 'I':            curNum = 1;            if (curNum >= pre) {                sum += curNum;            } else {                sum -= curNum;            }            pre = curNum;            break;        case 'X':            curNum = 10;            if (curNum >= pre) {                sum += curNum;            } else {                sum -= curNum;            }            pre = curNum;            break;        case 'V':            curNum = 5;            if (curNum >= pre) {                sum += curNum;            } else {                sum -= curNum;            }            pre = curNum;            break;        case 'L':            curNum = 50;            if (curNum >= pre) {                sum += curNum;            } else {                sum -= curNum;            }            pre = curNum;            break;        case 'C':            curNum = 100;            if (curNum >= pre) {                sum += curNum;            } else {                sum -= curNum;            }            pre = curNum;            break;        case 'D':            curNum = 500;            if (curNum >= pre) {                sum += curNum;            } else {                sum -= curNum;            }            pre = curNum;            break;        case 'M':            curNum = 1000;            if (curNum >= pre) {                sum += curNum;            } else {                sum -= curNum;            }            pre = curNum;            break;        default:            break;        }    }    return sum;}

时间复杂度 O(1)
空间复杂度 O(1)

一直在想这题的解法用数组如何解。discuss看到了。挺满意的
罗马数字转10进制,再对10进制数字操作。
static int romanToIntV3(String s) {
char[] charArray = s.toCharArray();
int [] int_array=new int [charArray.length];
int sum=0;

    for (int i = 0; i < s.length(); i++) {        switch (charArray[i]) {        case 'I':            int_array[i] = 1; break;        case 'V':            int_array[i] = 5; break;        case 'X':            int_array[i] = 10; break;        case 'L':            int_array[i] = 50; break;        case 'C':            int_array[i] = 100; break;        case 'D':            int_array[i] = 500; break;        case 'M':            int_array[i] = 1000; break;        }    }    for(int j=0;j<int_array.length;j++)    {        if(j+1<int_array.length && int_array[j]<int_array[j+1])        {            sum-=int_array[j];        }else        {            sum+=int_array[j];        }    }    return sum;}

zzzz 睡觉。

0 0
原创粉丝点击