《LeetBook》leetcode题解(12):Integer to Roman[M]
2016-04-16 14:54
393 查看
我现在在做一个叫《leetbook》的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看
书的地址:https://hk029.gitbooks.io/leetbook/
Input is guaranteed to be within the range from 1 to 3999.
上面是罗马数字所有的符号。
罗马数字的规则:
一般情况下,从左到右从大到小排,字母代表的数字累加。
比如:
XII = 12
MDCCLXVI= 1000+500+100+100+50+10+5+1
但是有特殊情况,就是,如果数字的范围在大数减小数的范围内,则会出现小数在大数前面的情况,代表(大数-小数)
IV = 5-1
IX= 10 - 1 = 9
XL = 50-10 = 40
我们现在拿到一个数N
我们就去表里面找不超过它的最大的数x,
然后把它入我们的输出字符串中,然后将数N-=x,
继续执行这个操作,直到N=0
书的地址:https://hk029.gitbooks.io/leetbook/
012. Integer to Roman[M]
问题
Given an integer, convert it to a roman numeral.Input is guaranteed to be within the range from 1 to 3999.
思路
分析罗马数字的规律:Symbol | Value |
---|---|
I | 1 |
V | 5 |
X | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1,000 |
罗马数字的规则:
一般情况下,从左到右从大到小排,字母代表的数字累加。
比如:
XII = 12
MDCCLXVI= 1000+500+100+100+50+10+5+1
但是有特殊情况,就是,如果数字的范围在大数减小数的范围内,则会出现小数在大数前面的情况,代表(大数-小数)
IV = 5-1
IX= 10 - 1 = 9
XL = 50-10 = 40
Symbol | Value |
---|---|
IV | 4 |
IX | 9 |
XL | 40 |
XC | 90 |
CD | 400 |
CM | 900 |
思路1——循环
一旦把所有可能的情况符号情况都列举出来了,就好做了。我们现在拿到一个数N
我们就去表里面找不超过它的最大的数x,
然后把它入我们的输出字符串中,然后将数N-=x,
继续执行这个操作,直到N=0
public class Solution { public String intToRoman(int num) { int list[] = {1000,900,500,400,100,90,50,40,10,9,5,4,1}; String chars[] = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"}; int i = 0; String out=""; while(num > 0) { for(;i < list.length;i++) if(num >= list[i]) break; out+=chars[i]; num -= list[i]; } return out; } }
思路2——查表
还有个更极端的方案,就是,把每位上可能出现的情况都列举出来,剩下的,只用查表就行了。public class Solution { public static String intToRoman(int num) { String M[] = {"", "M", "MM", "MMM"}; String C[] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}; String X[] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}; String I[] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}; return M[num/1000] + C[(num%1000)/100] + X[(num%100)/10] + I[num%10]; } }
相关文章推荐
- Android 里子线程真的不能刷新UI吗?
- JS标签的各种事件的举例
- 第七周学习进度
- 拷贝构造函数
- Spring事务配置常用的两种方法
- iOS9 之后设置状态栏的颜色
- Socket多接收者
- Linux进程的睡眠和唤醒简析
- str系列函数
- 《LeetBook》leetcode题解(11):Container With Most Water[M] ——用两个指针在数组内移动
- Java在mysql插入数据的时候的乱码问题解决
- ubuntu 15.04安装VMware11
- CF 472A Design Tutorial: Learn from Math
- 拼事务语句并获取事务返回值
- Android事件处理之监听事件
- 【转】Android 之ActivityThead、ActivityManagerService 与activity的管理和创建
- C++ 常见问题
- 【贪心】HDU 1257
- React Native note
- 自定义View模板(一)