题目链接

思路

我是按照穷举条件的方法,从1000、500、100…依次除余,判断有多少个1000,500….再根据900需要1个500,4个100这个样子依次判断,代码异常丑陋,不过效率很高,用时和内存都达到100%,哈哈哈

代码

  1. fun intToRoman(num: Int): String {
  2. var num = num
  3. val mNum = num / 1000; num -= mNum * 1000
  4. var dNum = num / 500; num -= dNum * 500
  5. var cNum = num / 100; num -= cNum * 100
  6. var lNum = num / 50; num -= lNum * 50
  7. var xNum = num / 10; num -= xNum * 10
  8. var vNum = num / 5; num -= vNum * 5
  9. var iNum = num
  10. val sb = StringBuilder()
  11. // 1000
  12. for (i in 0 until mNum) sb.append('M')
  13. // 900
  14. if (dNum == 1 && cNum == 4) {
  15. sb.append("CM")
  16. dNum -= 1
  17. cNum -= 4
  18. }
  19. // 500
  20. for (i in 0 until dNum) sb.append('D')
  21. // 400
  22. if (cNum == 4) {
  23. sb.append("CD")
  24. cNum -= 4
  25. }
  26. // 100
  27. for (i in 0 until cNum) sb.append('C')
  28. // 90
  29. if (lNum == 1 && xNum == 4) {
  30. sb.append("XC")
  31. lNum -= 1
  32. xNum -= 4
  33. }
  34. // 50
  35. for (i in 0 until lNum) sb.append('L')
  36. // 40
  37. if (xNum == 4) {
  38. sb.append("XL")
  39. xNum -= 4
  40. }
  41. // 10
  42. for(i in 0 until xNum) sb.append('X')
  43. // 9
  44. if (vNum == 1 && iNum == 4) {
  45. sb.append("IX")
  46. vNum -= 1
  47. iNum -= 4
  48. }
  49. // 5
  50. for (i in 0 until vNum) sb.append('V')
  51. // 4
  52. if (iNum == 4) {
  53. sb.append("IV")
  54. iNum -= 4
  55. }
  56. // 1
  57. for (i in 0 until iNum) sb.append('I')
  58. return sb.toString()
  59. }

优雅的代码

fun intToRoman(num: Int): String {

    val values = intArrayOf(1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000)
    val strs = arrayOf("I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M")

    val str = StringBuilder()
    var numCopy = num

    for (i in values.size - 1 downTo 0) {
        while (numCopy >= values[i]) {
            str.append(strs[i])
            numCopy -= values[i]
        }

    }

    return str.toString()
}