image.png

解题思路:

  1. 罗马数字计数方法:
  2. 1. 相同的数字连写,所表示的数等于这些数字相加得到的数,如:III=3
  3. 2. 小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,如:VIII=8, XII=12
  4. 3. 小的数字在大的数字的左边(限于 IVIXXLXCCDCM),所表示的数等于大数减小数得到的数,如:IV=4, IX=9
  5. 4. 正常使用时,连写的数字重复不得超过三次;

我们可以将所有减法操作看做一个整体,当成一种新的单位。从大到小整理所有单位得到

M CM D CD C XC L XL X IX V IV I
1000 900 500 400 100 90 50 40 10 9 5 4 1
  • 我们可以将目标整数看成这些单位值的加和,且同一种单位不能使用超过3次,所以我们尽可能优先使用值较大的单位即可。

PHP代码实现:

  1. class Solution {
  2. /**
  3. * @param Integer $num
  4. * @return String
  5. */
  6. function intToRoman($num) {
  7. $value = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];
  8. $str = ['M', 'CM', 'D', 'CD', 'C',
  9. 'XC', 'L', 'XL', 'X',
  10. 'IX', 'V', 'IV', 'I'];
  11. $roman = '';
  12. for ($i = 0; $i < count($value); $i ++) {
  13. while ($num >= $value[$i]) {
  14. $num -= $value[$i];
  15. $roman .= $str[$i];
  16. }
  17. }
  18. return $roman;
  19. }
  20. }

GO代码实现:

  1. func intToRoman(num int) (roman string) {
  2. values := []int{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}
  3. str := []string{"M", "CM", "D", "CD", "C",
  4. "XC", "L", "XL", "X", "IX",
  5. "V", "IV", "I"}
  6. for i:= 0; i < len(values); i++ {
  7. for num >= values[i] {
  8. num -= values[i];
  9. roman += str[i]
  10. }
  11. }
  12. return
  13. }