你的位置:首页 > Java教程

[Java教程]No.012:Integer to Roman


题目:

 

Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.

官方难度:

Medium

翻译:

给定一个整数,将其翻译成罗马数字。输入整数范围是1-3999。

补充资料:

罗马数字规则:
1. 罗马数字共有7个,即I(1)、V(5)、X(10)、L(50)、C(100)、D(500)和M(1000)。罗马数字中没有“0”。
2. 重复次数:一个罗马数字最多重复3次。
3. 右加左减:
在较大的罗马数字的右边记上较小的罗马数字,表示大数字加小数字。
在较大的罗马数字的左边记上较小的罗马数字,表示大数字减小数字。
4. 左减的数字有限制,仅限于I、X、C,且放在大数的左边只能用一个。
(*) V 和 X 左边的小数字只能用I。
(*) L 和 C 左边的小数字只能用X。
(*) D 和 M 左 边的小数字只能用C。

思路:

1. 确定最高位数。根据位数创建罗马数字对应的二维数组。

2. 根据给定输入的每一位上的数字,匹配二维数组的对应位置,逐字累加至StringBuffer的结果字符串。

3. 先将4和9特殊处理。

4. 不是4和9的情况,判断是否大于等于5,若是,将V(假定正在处理个位数)加至结果字符串。

5. 将当前数字除以5的余数的值,累加I的个数。

解题中可能遇到的困难:

1. 确定最高位时,需要创建一个输入值的副本。

2. 不考虑空间消耗的角度,可以采取定义一个10*n的二维数组,而不是2*n的二维数组,不易出错。

解题代码:

 1 private static String method(int number) { 2     // 入参保护 3     if (number > 3999 || number < 1) { 4       return null; 5     } 6     // 结果集 7     StringBuffer result = new StringBuffer(); 8     // 罗马字符集 9     char[][] romanArray = new char[][] { { 'I', 'V' }, { 'X', 'L' }, { 'C', 'D' }, { 'M' } };10     // 创建副本确定最高位数11     int maxLevel = 0;12     int copyNumber = number;13     while (copyNumber > 0) {14       copyNumber /= 10;15       maxLevel++;16     }17     while (--maxLevel >= 0) {18       // 罗马数字从左往右是最高位的19       int currentNumber = (int) ((number / Math.pow(10, maxLevel)) % 10);20       // 4,9特别处理21       if (currentNumber == 4) {22         result.append("" + romanArray[maxLevel][0] + romanArray[maxLevel][1]);23       } else if (currentNumber == 9) {24         result.append("" + romanArray[maxLevel][0] + romanArray[maxLevel + 1][0]);25       } else {26         // 大于等于5处理27         if (currentNumber / 5 == 1) {28           result.append(romanArray[maxLevel][1]);29         }30         // 加131         for (int i = 0; i < currentNumber % 5; i++) {32           result.append(romanArray[maxLevel][0]);33         }34       }35     }36     return result.toString();37   }

View Code

测试代码地址:

https://github.com/Gerrard-Feng/LeetCode/blob/master/LeetCode/src/com/gerrard/algorithm/medium/Q012.java

LeetCode题目地址:

https://leetcode.com/problems/integer-to-roman/

PS:如有不正确或提高效率的方法,欢迎留言,谢谢!




深圳旅游必去景点是深圳去深圳旅游费用深圳旅游攻略2015自助游深圳旅游攻略必去景点深圳旅游攻略两天路线伦敦交响乐团 顶级乐章在这里奏响 2015增城白水寨三八妇女节好玩活动?白水寨3.8门票优惠多少? 三八妇女节去长隆能看奇妙的朋友的动物吗?长隆3.8女士门票优惠多少? 2015广州长隆野生动物园三八妇女节优惠活动?长隆3.8女士门票多少? 最美风景线 318国道上的四川 星月对望 体验不可思议的奇妙观星地[四] 腾冲有那些美食? 如果你来无锡,我才不带你去灵山 2015东部华侨城月光茶宴什么时候?深圳东部华侨城月光茶宴时间? 荷花世界嫦娥大巡游活动时间?三水荷花世界嫦娥大巡游有什么好玩的? 2015三水荷花世界风筝节什么时候?荷花世界风筝节活动介绍? 2015深圳中秋节晚会地点?深圳中秋节烟花晚会去哪看? 2015高淳螃蟹节是什么时候?2015高淳螃蟹节攻略 雅鲁藏布大峡谷最佳旅游时间是什么时候? 中国最富裕的十个县级市 有你的城市吗 去长白山前 何不驻足这个美丽小镇 Q65110A9535 Datasheet Q65110A9535 Datasheet Q65110A9536 Datasheet Q65110A9536 Datasheet Q65110A9541 Datasheet Q65110A9541 Datasheet 深圳动物园门票 深圳动物园门票 深圳动物园门票 桂林旅游注意事项 桂林旅游注意事项 桂林旅游注意事项 深圳风景图片 深圳风景图片 深圳风景图片