作者 : XiaXinyu
日期 :2021-10-02
题目
理解题意
给定一个整数,按照罗马数字的表示方法将其转换为罗马数字,进行模拟即可
题解1
罗马数字中一共包含13个字符,其中包括6个复合字符
为了表示整数n,可以不断寻找不超过n的最大整数值,并将该整数值转换为罗马字符,然后再不断减去该整数值,直到n等于0,这时即完成转换
class Solution {
int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
String[] symbols = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
public String intToRoman(int num) {
StringBuffer roman = new StringBuffer(); //不要将答案定义为String然后做+=操作,因为String是常量,重新创建对象很耗时
for(int i = 0;i < 13;i ++){
while(values[i] <= num){ //寻找不超过num的最大整数值
num -= values[i];
roman.append(symbols[i]);
}
if(num == 0) break;
}
return roman.toString();
}
}
时间复杂度
:O(1) 最多执行13次循环
空间复杂度
:O(1)
题解2(硬编码做法)
可以发现从个位到千位,不同位的数字都有自己的表示方式,个位、十位、百位各有10种表示方式,而千位只有4种(0也算一种表示方式,对应空字符串
)
然后可以将4个不同位的数字表示分为四组,根据每位的数字直接转换为古罗马数字
所以整体思路就是利用取模和除法操作进行数位分离,然后根据不同位的数字进行查表转换
代码
class Solution {
String[] thousands = {"", "M", "MM", "MMM"};
String[] hundreds = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
String[] tens = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
String[] ones = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
public String intToRoman(int num) {
StringBuffer roman = new StringBuffer();
roman.append(thousands[num / 1000]);
roman.append(hundreds[num % 1000 / 100]);
roman.append(tens[num % 100 / 10]);
roman.append(ones[num % 10]);
return roman.toString();
}
}
时间复杂度
:O(1)
空间复杂度
:O(1)
个人感觉这种做法还是很巧妙的,再回头看看自己AC时的代码,水平差太多啦哈哈哈
读算法千遍不如自己实现一遍,加油!!!