java转罗马数字,【LeetCode-字符串】整数转罗马数字(示例代码)

题目描述

罗马数字包含以下七种字符: 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 的范围内。

示例:

输入: 3

输出: "III"

输入: 4

输出: "IV"

输入: 9

输出: "IX"

输入: 58

输出: "LVIII"

解释: L = 50, V = 5, III = 3.

输入: 1994

输出: "MCMXCIV"

解释: M = 1000, CM = 900, XC = 90, IV = 4.

思路

由于罗马数字中小的数字在大的数字的右边,所以先从大的数字开始匹配,匹配顺序为["M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"]。代码如下:

class Solution {

public:

string intToRoman(int num) {

if(num==0){

return "";

}

string ans = "";

while(num!=0){

if(num>=1000){

ans += "M";

num -= 1000;

}else if(num>=900){

ans += "CM";

num -= 900;

}else if(num>=500){

ans += "D";

num -= 500;

}else if(num>=400){

ans += "CD";

num -= 400;

}else if(num>=100){

ans += "C";

num -= 100;

}else if(num>=90){

ans += "XC";

num -= 90;

}else if(num>=50){

ans += ‘L‘;

num -= 50;

}else if(num>=40){

ans += "XL";

num -= 40;

}else if(num>=10){

ans += "X";

num -= 10;

}else if(num>=9){

ans += "IX";

num -= 9;

}else if(num>=5){

ans += "V";

num -= 5;

}else if(num>=4){

ans += "IV";

num -= 4;

}else if(num<4 && num>0){

ans += "I";

num--;

}

}

return ans;

}

};

时间复杂度:O(n)

空间复杂度:O(1)

更简洁的写法

可以将上面的写法进行简化,如下

class Solution {

public:

string intToRoman(int num) {

if(num==0){

return "";

}

string ans = "";

vector keys({1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1});

vector values({"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"});

for(int i=0; i

while(num>=keys[i]){

num -= keys[i];

ans += values[i];

}

}

return ans;

}

};

相关题目

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值