2021/3/23,今天遇到一个很有意思的题,题意如下:
这道题乍一看有点蒙,但是仔细思考一下可以发现规律。和找零钱问题一样我们要尽可能的使用大面值的数字。所以我们可以用贪心算法构造数组。但是需要注意的是有几种特殊情况,比如4,9,40之类的,见下图(图片来自Leecode官方题解 )
我们按照这种方法构造就可以完成罗马数字的转换了。
c++参考代码:
class Solution {
public:
string intToRoman(int num) {
string str[]= {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
int nums[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
string ans="";
int now=num;
for(int i=0;i<13;i++)
{
while(now>=nums[i])
{
now-=nums[i];
ans+=str[i];
}
}
return ans;
}
};
时间复杂度:O(lgN)。
参考资料
·力扣官方题解
·liweiwei1419《贪心算法》