leetcode12

题目分析:

这道题目的要求是输入数字,得到对应的罗马数字。

首先得明白Roman数字构成,具体如下所示:

  • 阿拉伯数字4 对应的罗马数字 IV
  • 阿拉伯数字9 对应的罗马数字 IX
  • 阿拉伯数字40 对应的罗马数字 XL
  • 阿拉伯数字90 对应的罗马数字 XC
  • 阿拉伯数字400 对应的罗马数字 CD

在了解罗马数字的基础上,对题意展开分析可知

步骤1. I 对应 1, V 对应 5, X 对应 10,  L 对应 50, C 对应 100, D 对应 500, M 对应 1000; s就是有IVXLCDM这些字符组合而成。用p指向s中第一个字符,q指向s中第二个字符,用ans保存结果。 
步骤2. 如果p指向字符对应的数值比q指向的大,则将p指向字符所对应的数值加到ans中;否则,从ans中减去p指向字符所对应数值。更新p和q(即p++,q++),重复执行步骤2,直到q指向最后一个字符。
步骤3. 对于最后一个字符,将其对应的数值加到ans中。
在这里我们使用STL中的map映照容器。建立罗马字符与阿拉伯数字之间的关系。

class Solution {
public:
        string intToRoman(int num){
            string ans=" ";//定义字符串ans为一个新的空字符串
            int buf[13]={1000,900, 500,400,100,90,50,40,10,9,5,4,1};//用buff数组存储常见罗马字符对应的汉字
            string roman[13]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};//用roman[]数组存储常见罗马字符
            int idx=0;//设置索引初值为0
            int count;//count值用于记录对应数位的数字个数
            while(num>0){//判断num值的大小,若num值大于0时展开循环
                count=num/buf[idx];//计算对应数位的个数
                while(count--)
                    ans+=roman[idx];//在ans上加入count个对应的相应数字
                num=num%buf[idx];//num的值进行降位
                idx++;标签值递加
            }
            return ans;//返回最后的结果
    }
};

猜你喜欢

转载自blog.csdn.net/hua111hua/article/details/83052838