题目描述
请将给出的整数转化为罗马数字
保证输入数字的范围在1 到 3999之间。
罗马数字包含以下七种字符: 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 到 3999 的范围内。
示例 1:
输入: 3
输出: "III"
示例 2:
输入: 4
输出: "IV"
示例 3:
输入: 9
输出: "IX"
示例 4:
输入: 58
输出: "LVIII"
解释: L = 50, V = 5, III = 3.
示例 5:
输入: 1994
输出: "MCMXCIV"
解释: M = 1000, CM = 900, XC = 90, IV = 4.
思路:
用两个数组分别存储数字和罗马字符, 从大到小减,直至为0:
public class Solution {
public String intToRoman(int num) {
if(num<1||num>3999)
return null;
String res="";
int[] number={1000,900,500,400,100,90,50,40,10,9,5,4,1};
String[] str={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
for(int i=0;i<13;i++){
while(num>=number[i]){
res=res+str[i];
num=num-number[i];
}
}
return res;
}
}
用switch case逐个遍历,num每次初10直至为0
class Solution {
public String intToRoman(int num) {
if(num<1||num>3999){
return null;
}
String str="";
String temp="";
int s=num%10;
int k=num/10;
for(int i=1;i<=4;i++){
if(i==1){
switch(s){
case 0:{
temp="";
break;
}
case 1:{
temp="I";
break;
}
case 2 :{
temp="II";
break;
}
case 3:{
temp="III";
break;
}
case 4:{
temp="IV";
break;
}
case 5:{
temp="V";
break;
}
case 6:{
temp="VI";
break;
}
case 7:{
temp="VII";
break;
}
case 8:{
temp="VIII";
break;
}
case 9:{
temp="IX";
break;
}
}
}
else if(i==2){
switch(s){
case 0:{
temp="";
break;
}
case 1:{
temp="X";
break;
}
case 2:{
temp="XX";
break;
}
case 3:{
temp="XXX";
break;
}
case 4:{
temp="XL";
break;
}
case 5:{
temp="L";
break;
}
case 6:{
temp="LX";
break;
}
case 7:{
temp="LXX";
break;
}
case 8:{
temp="LXXX";
break;
}
case 9:{
temp="XC";
break;
}
}
}
else if(i==3){
switch(s){
case 0:{
temp="";
break;
}
case 1:{
temp="C";
break;
}
case 2:{
temp="CC";
break;
}
case 3:{
temp="CCC";
break;
}
case 4:{
temp="CD";
break;
}
case 5:{
temp="D";
break;
}
case 6:{
temp="DC";
break;
}
case 7:{
temp="DCC";
break;
}
case 8:{
temp="DCCC";
break;
}
case 9:{
temp="CM";
break;
}
}
}
else{
switch(s){
case 0:{
temp="";
break;
}
case 1:{
temp="M";
break;
}
case 2:{
temp="MM";
break;
}
case 3:{
temp="MMM";
break;
}
}
}
str=temp+str;
s=k%10;
k=k/10;
}
return str;
}
}
题目描述
请将给出的罗马数字转化为整数
保证输入的数字范围在1 到 3999之间。
罗马数字包含以下七种字符: 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 到 3999 的范围内。
示例 1:
输入: "III"
输出: 3
示例 2:
输入: "IV"
输出: 4
示例 3:
输入: "IX"
输出: 9
示例 4:
输入: "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.
示例 5:
输入: "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.
思路:
从大到小遍历所有的罗马字符
public class Solution {
public int romanToInt(String s) {
if(s==null)
return 0;
int[] number={1000,900,500,400,100,90,50,40,10,9,5,4,1};
String[] str={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
int res=0,index=0,end=0;
for(int i=0;i<str.length;i++){
String temp=str[i];
end=index+temp.length();
while(end<=s.length()&&s.substring(index,end).equals(temp)){
res=res+number[i];
index=end;
end=index+temp.length();
}
}
return res;
}
}
逐个遍历字符串的每两个字符,若是合法字符则继续,不是合法字符则遍历一个字符
class Solution {
public int romanToInt(String s) {
if(s==null){
return 0;
}
int res=0;
for(int i=0;i<s.length();i++){
int cur=i;
String temp="";
if(i+2<=s.length()){
temp=s.substring(i,i+2);
switch(temp){
case "CM":{
res=res+900;
i++;
break;
}
case "CD":{
res=res+400;
i++;
break;
}
case "XC":{
res=res+90;
i++;
break;
}
case "XL":{
res=res+40;
i++;
break;
}
case "IX":{
res=res+9;
i++;
break;
}
case "IV":{
res=res+4;
i++;
break;
}
default :{
break;
}
}
}
temp=s.substring(i,i+1);
if(cur==i){
switch(temp){
case "M":{
res=res+1000;
break;
}
case "D":{
res=res+500;
break;
}
case "C":{
res=res+100;
break;
}
case "L":{
res=res+50;
break;
}
case "X":{
res=res+10;
break;
}
case "V":{
res=res+5;
break;
}
case "I":{
res=res+1;
break;
}
default :{
break;
}
}
}
}
return res;
}
}