No.012: Integer to Roman, no.012roman
Question:
Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
Official difficulty:
Medium
Translation:
A given integer is translated into a Roman number. The input Integer Range is 1-3999.
Additional information:
Roman numerals:
1. there are 7 roman numerals, namely I (1), V (5), X (10), L (50), C (100), D (500) and M (1000 ). There is no "0" in the Roman numerals ".
2. Repeated times: a roman number can be repeated three times at most.
3. Add right minus:
On the right side of a large number, remember a small number to indicate a large number and a small number.
On the left side of a large roman number, a small roman number is displayed, indicating that a large number reduces the number.
4. There is a limit on the number to be subtracted from the left, which is limited to I, X, and C. Only one number can be used on the left of a large number.
(*) The small numbers on the left of V and X can only use I.
(*) The small numbers on the left of L and C can only use X.
(*) The small numbers on the left side of D and M can only use C.
Ideas:
1. determine the maximum number of digits. Create a two-dimensional array corresponding to the number of digits.
2. Match the corresponding position of the two-dimensional array based on the number on each digit of the given input, and add the result string to StringBuffer word by word.
3. perform special processing on the 4 and 9 nodes first.
4. If it is not the case of 4 and 9, determine whether the value is greater than or equal to 5. If so, add V (assuming that the number of digits is being processed) to the result string.
5. Divide the current number by the remainder of 5 and accumulate the number of I.
Possible difficulties in solving problems:
1. When determining the maximum bit, you need to create a copy of the input value.
2. without considering the space consumption angle, you can define a 10 * n two-dimensional array instead of a 2 * n two-dimensional array, which is not prone to errors.
Solution code:
1 private static String method (int number) {2 // input parameter protection 3 if (number> 3999 | number <1) {4 return null; 5} 6 // result set 7 StringBuffer result = new StringBuffer (); 8 // Rome character set 9 char [] [] romanArray = new char [] [] {'I', 'V'}, {'x', 'L '}, {'C', 'D'}, {'M'}; 10 // create a copy to determine the maximum number of digits 11 int maxLevel = 0; 12 int copyNumber = number; 13 while (copyNumber> 0) {14 copyNumber/= 10; 15 maxLevel ++; 16} 17 while (-- maxLevel> = 0) {18 // The 19 int currentNumber = (int) (number/Math. pow (10, maxLevel) % 10); 20 // 4, 9 specially handles 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 // greater than or equal to 5 Processing 27 if (currentNumber/5 = 1) {28 result. append (romanArray [maxLevel] [1]); 29} 30 // plus 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
Test Code address:
Https://github.com/Gerrard-Feng/LeetCode/blob/master/LeetCode/src/com/gerrard/algorithm/medium/Q012.java
LeetCode address:
Https://leetcode.com/problems/integer-to-roman/
PS: If you have any incorrect or more efficient methods, please leave a message. Thank you!