博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetCode 13 Roman to Integer
阅读量:6801 次
发布时间:2019-06-26

本文共 3574 字,大约阅读时间需要 11 分钟。

第一时间发布

题目描述(简单难度)

和上一道题相反,将罗马数字转换成阿拉伯数字。

解法一

先来一种不优雅的,也就是我开始的想法。就是遍历字符串,然后转换就可以,但同时得考虑 IV,IX 那些特殊情况。

public int getInt(char r) {		int ans = 0;		switch (r) {		case 'I':			ans = 1;			break;		case 'V':			ans = 5;			break;		case 'X':			ans = 10;			break;		case 'L':			ans = 50;			break;		case 'C':			ans = 100;			break;		case 'D':			ans = 500;			break;		case 'M':			ans = 1000;		}		return ans;	}	public int getInt(char r, char r_after) {		int ans = 0;		switch (r) {		case 'I':			ans = 1;			break;		case 'V':			ans = 5;			break;		case 'X':			ans = 10;			break;		case 'L':			ans = 50;			break;		case 'C':			ans = 100;			break;		case 'D':			ans = 500;			break;		case 'M':			ans = 1000;			break;		}		if (r == 'I') {			switch (r_after) {			case 'V':				ans = 4;				break;			case 'X':				ans = 9;			}		}		if (r == 'X') {			switch (r_after) {			case 'L':				ans = 40;				break;			case 'C':				ans = 90;			}		}		if (r == 'C') {			switch (r_after) {			case 'D':				ans = 400;				break;			case 'M':				ans = 900;			}		}		return ans;	}	public boolean isGetTwoInt(char r, char r_after) {		if (r == 'I') {			switch (r_after) {			case 'V':				return true;			case 'X':				return true;			}		}		if (r == 'X') {			switch (r_after) {			case 'L':				return true;			case 'C':				return true;			}		}		if (r == 'C') {			switch (r_after) {			case 'D':				return true;			case 'M':				return true;			}		}		return false;	}	public int romanToInt(String s) {		int ans = 0;		for (int i = 0; i < s.length() - 1; i++) {			ans += getInt(s.charAt(i), s.charAt(i + 1));            //判断是否是两个字符的特殊情况			if (isGetTwoInt(s.charAt(i), s.charAt(i + 1))) {				i++;			}		}        //将最后一个字符单独判断,如果放到上边的循环会越界		if (!(s.length() >= 2 && isGetTwoInt(s.charAt(s.length() - 2), s.charAt(s.length() - 1)))) {			ans += getInt(s.charAt(s.length() - 1));		}		return ans;	}复制代码

时间复杂度:O(n),n 是字符串的长度。

空间复杂度:O(1)。

下边分享一些优雅的。

解法二

public int romanToInt(String s) {     int sum=0;    if(s.indexOf("IV")!=-1){sum-=2;}    if(s.indexOf("IX")!=-1){sum-=2;}    if(s.indexOf("XL")!=-1){sum-=20;}    if(s.indexOf("XC")!=-1){sum-=20;}    if(s.indexOf("CD")!=-1){sum-=200;}    if(s.indexOf("CM")!=-1){sum-=200;}        char c[]=s.toCharArray();    int count=0;       for(;count<=s.length()-1;count++){       if(c[count]=='M') sum+=1000;       if(c[count]=='D') sum+=500;       if(c[count]=='C') sum+=100;       if(c[count]=='L') sum+=50;       if(c[count]=='X') sum+=10;       if(c[count]=='V') sum+=5;       if(c[count]=='I') sum+=1;          }      return sum;    }复制代码

把出现的特殊情况,提前减了就可以。

时间复杂度:O(1)。

空间复杂度:O(1)。

解法三

利用到罗马数字的规则,一般情况是表示数字大的字母在前,数字小的字母在后,如果不是这样,就说明出现了特殊情况,此时应该做减法。

private int getVal(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;        }        throw new IllegalArgumentException("unsupported character");    }        public int romanToInt(String s) {        int res = 0;        if(s.length() == 0) return res;        for (int i = 0; i < s.length() - 1; i++) {            int cur = getVal(s.charAt(i));            int nex = getVal(s.charAt(i+1));            if(cur < nex){                res -= cur;            }else{                res += cur;            }        }        return res + getVal(s.charAt(s.length()-1));    }复制代码

时间复杂度:O(1)。

空间复杂度:O(1)。

这道题也不难,自己一开始没有充分利用罗马数字的特点,而是用一些 if,switch 语句判断是否是特殊情况,看起来就很繁琐了。

转载地址:http://qdywl.baihongyu.com/

你可能感兴趣的文章
必须了解的五个光伏发电财务和税收政策
查看>>
思默特获评“用户满意服务奖”荣誉
查看>>
CYQ.DBImport 数据库反向工程及批量导数据库工具 V1.0 发布
查看>>
AT&T开发出400 GbE试验的SDN控制器
查看>>
DBA生存警示:主备环境误操作案例及防范建议
查看>>
聊天机器人并不适合每一项业务和每个人
查看>>
拼写错误影响黑客盗窃数亿美元
查看>>
真正的持续集成:分布式代码仓库和依赖
查看>>
KDD论文解读 | 想要双11抢单快?靠这个技术提速9MS
查看>>
Asp.net与Flex交互测试记录
查看>>
两招抵御APT攻击
查看>>
教师节有“假期” 网络电话传递温情祝福
查看>>
人们应将公共云与私有云的辩论抛之脑后
查看>>
RFID技术或将代替条形码和二维码
查看>>
新三板上市公司突破6000家安防公司103家
查看>>
中天携手协鑫集成共拓光伏市场
查看>>
云存储与视频监控协力合作 平安城市再提速
查看>>
Windows环境搭建Web自动化测试框架Watir
查看>>
两大方向各有机会,CRM SaaS还能怎么玩?
查看>>
再等两年 英特尔能否重回摩尔定律?
查看>>