罗马数字包含以下七种字符: I
, V
, X
, L
,C
,D
和 M
。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II
,即为两个并列的 1。12 写做 XII
,即为 X
+ II
。 27 写做 XXVII
, 即为 XX
+ V
+ II
。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII
,而是 IV
。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX
。这个特殊的规则只适用于以下六种情况:
I
可以放在V
(5) 和X
(10) 的左边,来表示 4 和 9。X
可以放在L
(50) 和C
(100) 的左边,来表示 40 和 90。C
可以放在D
(500) 和M
(1000) 的左边,来表示 400 和 900。
给你一个整数,将其转为罗马数字。
题目
罗马数字包含以下七种字符: I
, V
, X
, L
,C
,D
和 M
。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II
,即为两个并列的 1。12 写做 XII
,即为 X
+ II
。 27 写做 XXVII
, 即为 XX
+ V
+ II
。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII
,而是 IV
。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX
。这个特殊的规则只适用于以下六种情况:
I
可以放在V
(5) 和X
(10) 的左边,来表示 4 和 9。X
可以放在L
(50) 和C
(100) 的左边,来表示 40 和 90。C
可以放在D
(500) 和M
(1000) 的左边,来表示 400 和 900。
给你一个整数,将其转为罗马数字。
示例 1:
输入: num = 3
输出: "III"
示例 2:
输入: num = 4
输出: "IV"
示例 3:
输入: num = 9
输出: "IX"
示例 4:
输入: num = 58
输出: "LVIII"
解释: L = 50, V = 5, III = 3.
示例 5:
输入: num = 1994
输出: "MCMXCIV"
解释: M = 1000, CM = 900, XC = 90, IV = 4.
解
① 6+7=13种情况的if-else,按照从大到小顺序
最笨的办法,运行5ms,超过27.49%
class Solution {public String intToRoman(int num) {String str=new String();int x=0;if(num / 1000!=0){x=num/1000;while(x--!=0){str+="M";}num%=1000;}if(num/900!=0){x=num/900;while(x--!=0){str+="CM";}num%=900;} if(num/500!=0){x=num/500;while(x--!=0){str+="D";}num%=500;} if(num/400!=0){x=num/400;while(x--!=0){str+="CD";}num%=400;}if(num/100!=0){x=num/100;while(x--!=0){str+="C";}num%=100;}if(num/90!=0){x=num/90;while(x--!=0){str+="XC";}num%=90;}if(num/50!=0){x=num/50;while(x--!=0){str+="L";}num%=50;}if(num/40!=0){x=num/40;while(x--!=0){str+="XL";}num%=40;}if(num/10!=0){x=num/10;while(x--!=0){str+="X";}num%=10;}if(num/9!=0){x=num/9;while(x--!=0){str+="IX";}num%=9;}if(num/5!=0){x=num/5;while(x--!=0){str+="V";}num%=5;}if(num/4!=0){x=num/4;while(x--!=0){str+="IV";}num%=4;}if(num!=0){while(num--!=0){str+="I";}}return str;}
}
② StringBuilder类
采用数组的方式存储了13种数据的大小和对应的字符串,当num=0时意味着循环结束可以返回字符串。
class Solution {public String intToRoman(int num) {StringBuilder sb=new StringBuilder();int[] nums = new int[]{1000,900,500,400,100,90,50,40,10,9,5,4,1};String [] str = new String[]{"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};int count=0;while(num>0){while(num-nums[count]>=0){sb.append(str[count]);num-=nums[count];}count++;}return sb.toString();}
}
补充知识
StringBuilder类
StringBuilder
是Java中用于处理字符串的可变类。它允许在不创建新的字符串对象的情况下,对字符串进行动态的修改和操作。
与String
类不同,StringBuilder
对象是可变的,因此在需要对字符串进行多次修改时,使用StringBuilder
通常会更高效。
上述①当中因为每次判断之后都需要对string进行修改,所以运行速率较慢,②通过使用StringBuilder类,比使用连接符’+'效率更快。
常用方法:
-
append(): 在字符串构建器的末尾追加字符串、字符或其他数据。
StringBuilder sb = new StringBuilder(); sb.append("Hello"); sb.append(" "); sb.append("world");
-
insert(): 在指定位置插入字符串、字符或其他数据。
StringBuilder sb = new StringBuilder("Hello world"); sb.insert(5, ", "); // Hello, world
-
delete(): 删除从指定位置开始到指定位置结束之间的字符(前闭后开,包括开始位置不包括结束位置)。
StringBuilder sb = new StringBuilder("Hello world"); sb.delete(5, 11); // 删除 " world" 变成 "Hello"
-
deleteCharAt(): 删除指定位置的字符。
StringBuilder sb = new StringBuilder("Hello world"); sb.deleteCharAt(5); // 删除空格
-
replace(): 用指定字符串替换从指定开始索引到指定结束索引之间的字符。
StringBuilder sb = new StringBuilder("Hello world"); sb.replace(6, 11, "Java"); // 替换 "world" 为 "Java"
-
substring(): 返回从指定开始索引到指定结束索引之间的子字符串。
StringBuilder sb = new StringBuilder("Hello world"); String sub = sb.substring(6, 11); // 获取 "world"
-
reverse(): 反转字符串。
StringBuilder sb = new StringBuilder("Hello"); sb.reverse(); // 变为 "olleH"
-
charAt(): 返回指定索引处的字符。
cStringBuilder sb = new StringBuilder("Hello"); char c = sb.charAt(1); // 获取索引为1的字符 'e'
-
length(): 返回字符串的长度。
StringBuilder sb = new StringBuilder("Hello"); int length = sb.length(); // 返回5
-
indexOf() / lastIndexOf(): 返回指定字符串或字符在字符串构建器中第一次出现的索引或最后一次出现的索引。
StringBuilder sb = new StringBuilder("Hello world"); int index1 = sb.indexOf("o"); // 返回4 int index2 = sb.lastIndexOf("o"); // 返回7
-
toString(): 将字符串构建器转换为普通的字符串。
StringBuilder sb = new StringBuilder("Hello world"); String str = sb.toString(); // 返回 "Hello world"