12、整数转罗马数字

问题描述

在这里插入图片描述

问题分析

分析题目,可以这样考虑:按照罗马字符所表示的范围进行分层,依次匹配罗马字符,然后更新原数字,迭代进行,最终得到结果。


第一种解法:比较范围+迭代

罗马字符所表示的范围为:

  1. 1000-3999 M
  2. 900-1000 CM
  3. 500-900 D
  4. 400-500 CD
  5. 100-400 C
  6. 90-100 XC
  7. 50-90 L
  8. 40-50 XL
  9. 10-40 X
  10. 9 IX
  11. 5-9 V
  12. 4 IV
  13. 1-4 I

主要的时间花费在迭代时的比较上。

Java代码

class Solution {public String intToRoman(int num) {String result = "";while (num > 0){if (num >= 1000){num -= 1000;result = result+"M";}else if (num >= 900 && num < 1000){num -= 900;result = result+"CM";}else if (num >= 500 && num < 900){num -= 500;result = result+"D";}else if (num >= 400 && num < 500){num -= 400;result = result+"CD";}else if (num >= 100 && num < 400){num -= 100;result = result+"C";}else if (num >= 90 && num < 100){num -= 90;result = result+"XC";}else if (num >= 50 && num < 90){num -= 50;result = result+"L";}else if (num >= 40 && num < 50){num -= 40;result = result+"XL";}else if (num >= 10 && num < 40){num -= 10;result = result+"X";}else if (num >= 9 && num < 10){num -= 9;result = result+"IX";}else if (num >= 5 && num < 9){num -= 5;result = result+"V";}else if (num >= 4 && num < 5){num -= 4;result = result+"IV";}else if (num >= 1 && num < 4){num -= 1;result = result+"I";}}return result;}
}

结果分析

以上代码的执行结果:

执行时间内存消耗
25ms41.2MB

在这里插入图片描述


第二种解法:记录法(优化)

第一种方法的时间主要花费在比较上,数字在减小,但是每次还是从范围1000开始比较,进行了很多重复而无意义的比较操作。我们可以用记录法记录上次比较结束的地方,下次比较就直接从记录的地方开始即可。

Java代码

class Solution {public String intToRoman(int num) {StringBuilder sb = new StringBuilder();int[] value = {1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000};String[] symbol = {"I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M"};int n = value.length;for(int i = n - 1; i >= 0; i--) {if(num >= value[i]) {int count = num / value[i];num %= value[i];while(count-- > 0) {sb.append(symbol[i]);}}}return sb.toString();}
}

结果分析

以上代码的执行结果:

执行时间内存消耗
21ms38.1MB

在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部