[LeetCode] 12. Integer to Roman

Roman numerals are represented by seven different symbols: IVXLCD and M.

Symbol       Value
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

For example, 2 is written as II in Roman numeral, just two one's added together. 12 is written as XII, which is simply X + II. The number 27 is written as XXVII, which is XX + V + II.

Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII. Instead, the number four is written as IV. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX. There are six instances where subtraction is used:

  • I can be placed before V (5) and X (10) to make 4 and 9. 
  • X can be placed before L (50) and C (100) to make 40 and 90. 
  • C can be placed before D (500) and M (1000) to make 400 and 900.

Given an integer, convert it to a roman numeral.

Example 1:

Input: num = 3
Output: "III"
Explanation: 3 is represented as 3 ones.

Example 2:

Input: num = 58
Output: "LVIII"
Explanation: L = 50, V = 5, III = 3.

Example 3:

Input: num = 1994
Output: "MCMXCIV"
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

Constraints:

  • 1 <= num <= 3999

整数转换罗马数字。

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给你一个整数,将其转为罗马数字。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/integer-to-roman
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

13题是正好相反。题意是给一个整数,请把它转换成罗马数字。

这道题依然是需要搞清楚罗马数字的规则,尤其是几个比较重要的数字,1,4,5,9。这几个数字用罗马数字表示分别是 I, IV, V, X。因为只有这几个数字是不能随便表示的,我们需要把他们包含到规则里这样才不会遗漏。比如 9,在罗马数字里你只能表示为(10 - 1)的形式,不能表示成(5 + 4)的形式。同时根据题目给的表格,我们用单个罗马字母能表示的数字是 1000(M),所以我们可以创建一个 values 数组,里面记录一些特别的 values,然后再创建一个 strs 字符串数组,对应表示 values 数组里那些数字的罗马表示。我同时附上官方题解,展示了一张完整的罗马数字表。

接着我们开始看 num 到底是多大,如果 num 大于 1000,那么肯定开头是 M,num - 1000 之后我们再看他大于多少,总之要尽量先 append 表示数字比较大的罗马数字。

时间O(1) - 数字最大也只有3999,找罗马数字的次数是固定的

空间O(1) - 创建的 values 表其实是固定长度的,几乎不占额外空间

JavaScript实现

 1 /**
 2  * @param {number} num
 3  * @return {string}
 4  */
 5 var intToRoman = function (num) {
 6     var list = ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'];
 7     var valueList = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];
 8     var res = '';
 9     while (num !== 0) {
10         for (var i = 0; i < valueList.length; i++) {
11             if (num >= valueList[i]) {
12                 res += list[i];
13                 num -= valueList[i];
14                 break;
15             }
16         }
17     }
18     return res;
19 };

 

Java实现

 1 class Solution {
 2     public String intToRoman(int num) {
 3         int[] values = new int[] {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
 4         String[] strs = new String[] {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
 5         StringBuilder sb = new StringBuilder();
 6         for (int i = 0; i < strs.length; i++) {
 7             while (num >= values[i]) {
 8                 num -= values[i];
 9                 sb.append(strs[i]);
10             }
11         }
12         return sb.toString();
13     }
14 }

 

LeetCode 题目总结

posted @ 2020-01-29 02:05  CNoodle  阅读(479)  评论(0)    收藏  举报