星空网 > 软件开发 > 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的二维数组,不易出错。

解题代码:

No.012:Integer to RomanNo.012:Integer to Roman
 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:如有不正确或提高效率的方法,欢迎留言,谢谢!




原标题:No.012:Integer to Roman

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

请注意!英国UKCA认证标志将取代CE标志!:https://www.ikjzd.com/articles/135434
深度思考:海外网红营销从流行到常规:https://www.ikjzd.com/articles/135435
厕纸、圣诞产品大爆发;100万台安全隐患产品却在黑五前被召回:https://www.ikjzd.com/articles/135436
央视调查:年轻人买“潮玩”有多疯狂?:https://www.ikjzd.com/articles/135437
网一将创下销售新高?亚马逊独占鳌头:https://www.ikjzd.com/articles/135438
欧盟及英国电商增值税新政明年实施,卖家不用承担申报义务了吗?德勤专家告诉你:https://www.ikjzd.com/articles/135439
天坛最佳攻略 天坛必玩景点:https://www.vstour.cn/a/408240.html
央视新址为什么会找回:https://www.vstour.cn/a/408241.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流