zoukankan      html  css  js  c++  java
  • [Leetcode] Interger to roman 整数转成罗马数字

    Given an integer, convert it to a roman numeral.

    Input is guaranteed to be within the range from 1 to 3999.

    题意:将整数转换成罗马数字,这里就需要对什么是罗马数字有一些了解。一下部分摘选于百度百科

    计数方法:

    1)相同的数字连写,所表示的数等于这些数字相加得到的数,如:III=3;

    2)小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,如:VIII=8、XII=12;

    3)小的数字(限于I、X、和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:IV=4、IX=9;

    4)正常使用时,连写的数字重复不得超过三次;

    5)在一个数的上面画一条横线,表示这个数扩大1000倍。

    组数规则:

    1)基本数字I、X、C中的任何一个、自身连用构成数目、或者放在大数的右边连用构成数目,都不能超过三个;放在大数的左边只能一个;

    2)不能把基本数字V、L、D中的任何一个座位小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目只能用一个;

    3)V和X的左边的小数子只能用I;

    4)L和C的左边小数字只能用X;

    5)D和M左边的小数字只能用C;

    规则3~5可以理解为,放在左边的小数字只能是同一级别,额,好吧,具体含义得自己体会。

    方法一:题中给出了整数的范围, 用罗马数字给出各个数字对应的表现形式,用二维向量表示。值得注意的是 “” 的位置,求罗马数字的过程可以表示为从个位、十位、百位、千位一步步的计算,在返回值res的求值中,+两段的顺序不能颠倒。代码如下:

     1 class Solution {
     2 public:
     3     string intToRoman(int num) 
     4     {
     5         vector<vector<string>> strR=
     6         {
     7             {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"},
     8             {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"},
     9             {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"},
    10             {"", "M", "MM", "MMM"}
    11         };
    12 
    13         string res="";
    14         int row=0;
    15         while(num !=0)
    16         {
    17             int col=num%10;
    18             res=strR[row][col]+res;  //注意顺序
    19             row++;
    20             num/=10;
    21         }
    22         return res;
    23     }
    24 };

    方法二:参考Grandyang的博客,使用贪婪算法的解法。建立表格,每次通过查找当前最大的数,减去在查找。和上面解法的区别在于,上面是将每个数量级上的整数一次性转成罗马数字,这个是有点像用天平秤东西一样,从大到小的一个个试。代码如下:

     1 class Solution {
     2 public:
     3     string intToRoman(int num) 
     4     {
     5         string res;
     6         vector<int> intVal{1000,900,500,400,100,90,50,40,10,9,5,4,1};
     7         vector<string> strRoman{"M","CM","D","CD","C","XC","L","XL","X",
     8         "IX","V","IV","I"};
     9 
    10         for(int i=0;i<intVal.size();++i)
    11         {
    12             while(num>=intVal[i])
    13             {
    14                 num-=intVal[i];
    15                 res+=strRoman[i];
    16             }
    17         }   
    18         return res;
    19     }
    20 };
  • 相关阅读:
    不要在股市上浪费时间(够深刻,耽误自己真本事的提高,即使是价值投资也不值得去做)
    在公司里混日子最终伤害的是你自己
    天使投资人的作用
    115太酷了,居然出了个TV版客户端
    QWidget与HWND的互相转换
    Ubuntu12.10 下搭建基于KVM-QEMU的虚拟机环境(十五)
    QString的不常见用法
    不要神话创业,什么东西都可以自己做,损失就是不拿工资。如果吃不上饭了,那还是不要创业。服务器很便宜
    C++的try catch到底能防止什么错误?
    迷茫的时候,就随机择一去学,时间不要浪费在选择上了
  • 原文地址:https://www.cnblogs.com/love-yh/p/7053192.html
Copyright © 2011-2022 走看看