[LC]13. Roman to Integer
来源:互联网 发布:淘宝排版软件 编辑:程序博客网 时间:2024/05/18 02:14
一、问题描述
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
roman numerals:http://literacy.kent.edu/Minigrants/Cinci/romanchart.htm
二、我的思路
想到了用前后数字的关系决定是加还是减,但是卡住了…因为对右减的理解不够深刻。
右边要减掉的数字最多连续一位,没有连续的多位。而且要减掉的只有I,X,C这种最高位为1的字母。
计数规则参考:http://blog.csdn.net/wzy_1988/article/details/17057929
三、淫奇技巧
1. 常规法:从左向右处理,如果高位比低位数字小,说明要减去,否则做加法。
另辟一个数组,把每一位char转换成int再处理。我是用了Map存储转换规则,每次查表。他这样的做法省时间。
public int romanToInt(String s) { int nums[]=new int[s.length()]; for(int i=0;i<s.length();i++){ switch (s.charAt(i)){ case 'M': nums[i]=1000; break; case 'D': nums[i]=500; break; case 'C': nums[i]=100; break; case 'L': nums[i]=50; break; case 'X' : nums[i]=10; break; case 'V': nums[i]=5; break; case 'I': nums[i]=1; break; } } int sum=0; for(int i=0;i<nums.length-1;i++){ if(nums[i]<nums[i+1]) sum-=nums[i]; else sum+=nums[i]; } return sum+nums[nums.length-1];}
2. 有点淫奇~
先把前面数字比后面数字小的情况减去相应的数字。再把各位字母按照转换规则加起来。
比如IV,如果直接加和的话是1+5=6,但是因为罗马计数左减右加的规则,实际为5-1=4.这样就差了2,所以减去2.
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; }
从低位开始处理字符串,把处理过的低位和算出来。根据低位和和当前位的关系,判断是加是减。
因为左加右减规则中,减去的数字只有1,10,100这种最高位是1的,所以遇到5x这种直接加,遇到1x这种判断一下再决定加减。
要减去的左边数字比右边的数字和小,而且最多只减去一位。I如果出现在尾部>=5的地方,则减去,否则加上,以此类推……
public static int romanToInt(String s) {int res = 0;for (int i = s.length() - 1; i >= 0; i--) {char c = s.charAt(i);switch (c) {case 'I':res += (res >= 5 ? -1 : 1);break;case 'V':res += 5;break;case 'X':res += 10 * (res >= 50 ? -1 : 1);break;case 'L':res += 50;break;case 'C':res += 100 * (res >= 500 ? -1 : 1);break;case 'D':res += 500;break;case 'M':res += 1000;break;}}return res;}
四、知识点
String s的处理:
变成数组 -- char[] c = s.toCharArray();
取第i位 -- s.charAt(i);
switch() case用法。
五、碎碎念
似乎每个优秀答案里面都有自己想法的影子,从影子到清晰的思路差距还是很大啊~
继续加油~~
- [LC]13. Roman to Integer
- 13. Roman to Integer
- 13.Roman to Integer
- 13. Roman to Integer
- 13.Roman to Integer
- 13. Roman to Integer
- 13. Roman to Integer
- 13. Roman to Integer
- 13. Roman to Integer
- 13. Roman to Integer
- 13. Roman to Integer
- 13. Roman to Integer
- 13. Roman to Integer
- 13. Roman to Integer
- 13. Roman to Integer
- 13. Roman to Integer
- 13. Roman to Integer
- 13. Roman to Integer
- python:使用requests,bs4爬取西刺代理并验证
- Linux下的网络编程
- 【opencv学习之十五】Opencv Mat的浅层拷贝与深层拷贝
- 机器学习入门体验(一)
- 创建一个记事本软件
- [LC]13. Roman to Integer
- html块元素和内联元素
- 浅谈SpringMVC后端与前端Ajax的五种交互方法
- 入坑cocos之菜鸟瞎喷
- Shell 显示带颜色字体
- Eclipse中Debug功能使用
- NodeJS文件上传示例代码
- Python语言基础-TCP客户端的Socket通信
- perl 文件测试符