判断输入的是否是数字_LeetCode 13 罗马数字转整数

#13 罗马数字转整数

(题目好长...)

罗马数字包含以下七种字符: I,V,X,L,C,D和M。

字符          数值I             1V             5X             10L             50C             100D             500M             1000

例如,罗马数字2写做 II,即为两个并列的1。

12写做XII,即为X+ II。27写做XVII,即为XX+V+II。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如4不写做IIII,而是IV。数字1在数字5的左边,所表示的数等于大数5减小数1得到的数值4。同样地,数字9表示为IX。

这个特殊的规则只适用于以下六种情况:

① I可以放在V (5)和X (10)的左边,来表示4和9。

②X可以放在L(50)和C(100)的左边,来表示40和90。

③C可以放在D (500)和M (1000) 的左边,来表示400和900。

给定一个罗马数字,将其转换成整数。输入确保在1到3999的范围内。

461a9c37850ef06d0414038858c94b6f.png

1)哈希表

将所有可能的组合写入哈希表中。

先两位两位进行判断是否是特殊组合中的一种,若不满足则按照单个字符进行处理。

class Solution {    public int romanToInt(String s) {        Map map = new HashMap<>();        map.put("I", 1);        map.put("IV", 4);        map.put("V", 5);        map.put("IX", 9);        map.put("X", 10);        map.put("XL", 40);        map.put("L", 50);        map.put("XC", 90);        map.put("C", 100);        map.put("CD", 400);        map.put("D", 500);        map.put("CM", 900);        map.put("M", 1000);        int num = 0;        for(int i = 0; i             //先两位两位判断            if(i+1map.containsKey(s.substring(i, i+                num +=map.get(s.substring(i, i+2));                i+=2;            }            //再一位一位判断            else{                 num += map.get(s.substring(i, i+1));                i++;            }        }        return num;    }}

2)switch case

思路和上一种方法类似,只考虑了题目中所说的6种特殊情况,用了switch case方法,效率比哈希表高一些。

可以自己想想为什么是num+3、num+5、num+8、num+10 ......

class Solution {public int romanToInt(String s) {        int num=0;        for(int i=0;i                switch(s.charAt(i)){                    case 'I': num+=1;break;                    case 'V':                        num=(i-1>=0 && s.charAt(i-1) == 'I')?num+3:num+5;                        break;                    case 'X':                        num=(i-1>=0 && s.charAt(i-1)  == 'I') ? num+8 : num+10;                        break;                    case 'L':                        num=(i-1>=0 && s.charAt(i-1) == 'X') ? num+30 : num+50;                        break;                    case 'C':                        num=(i-1>=0 && s.charAt(i-1)  == 'X') ? num+80 : num+100;                        break;                    case 'D':                        num=(i-1>=0 && s.charAt(i-1) == 'C') ? num+300 : num+500;                        break;                    case 'M':                        num=(i-1>=0 && s.charAt(i-1) == 'C') ? num+800 : num+1000;                        break;                    default: break;            }        }        if(num >3999) return 0;        return num;    }}

3)大佬写的...

思路是:如果小数在大数的左边就减,小数在大数右边就加。也是用了switch case.

妙啊~

import java.util.*;class Solution {    public int romanToInt(String s) {        int sum = 0;        int preNum = getValue(s.charAt(0));        for(int i = 1;i < s.length(); i ++) {            int num = getValue(s.charAt(i));            if(preNum < num) {                sum -= preNum;            } else {                sum += preNum;            }            preNum = num;        }        sum += preNum;        return sum;    }        private int getValue(char ch) {        switch(ch) {            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;        }    }}

假期想一起学Java的小伙伴可以加qq群:563347237,相互监督,共同进步。

907d6f17508ccdeef098d5246404c03a.gif  【阅读全文】进入练习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值