• 【LeetCode】12 & 13


    12 - Integer to Roman

    Given an integer, convert it to a roman numeral.

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

    Solution: 枚举,考虑每个字符以及每两个字符的组合

    复制代码
     1 class Solution {
     2 public:
     3     string intToRoman(int num) {    //runtime:28ms
     4         string ret;
     5         //M<-->1000
     6         while(num >= 1000)
     7         {
     8             ret += 'M';
     9             num -= 1000;
    10         }
    11         //to here, num < 1000
    12         //CM<-->900
    13         if(num >= 900)
    14         {
    15             ret += "CM";
    16             num -= 900;
    17         }
    18         //to here, num < 900
    19         //D<-->500
    20         if(num >= 500)
    21         {
    22             ret += 'D';
    23             num -= 500;
    24         }
    25         //to here, num < 500
    26         if(num >= 400)
    27         {
    28             ret += "CD";
    29             num -= 400;
    30         }
    31         //to here, num < 400
    32         //C<-->100
    33         while(num >= 100)
    34         {
    35             ret += 'C';
    36             num -= 100;
    37         }
    38         //to here, num < 100
    39         //XC<-->90
    40         if(num >= 90)
    41         {
    42             ret += "XC";
    43             num -= 90;
    44         }
    45         //to here, num < 90
    46         //L<-->50
    47         if(num >= 50)
    48         {
    49             ret += 'L';
    50             num -= 50;
    51         }
    52         //to here, num < 50
    53         //XL<-->40
    54         if(num >= 40)
    55         {
    56             ret += "XL";
    57             num -= 40;
    58         }
    59         //to here, num < 40
    60         //X<-->10
    61         while(num >= 10)
    62         {
    63             ret += 'X';
    64             num -= 10;
    65         }
    66         //to here, num < 10
    67         //IX<-->9
    68         if(num >= 9)
    69         {
    70             ret += "IX";
    71             num -= 9;
    72         }
    73         //to here, num < 9
    74         //V<-->5
    75         if(num >= 5)
    76         {
    77             ret += 'V';
    78             num -= 5;
    79         }
    80         //to here, num < 5
    81         //IV<-->4
    82         if(num >= 4)
    83         {
    84             ret += "IV";
    85             num -= 4;
    86         }
    87         //to here, num < 4
    88         //I<-->1
    89         while(num >= 1)
    90         {
    91             ret += 'I';
    92             num -= 1;
    93         }
    94         return ret;
    95     }
    96 };
    复制代码

    13 - Roman to Integer

    Given a roman numeral, convert it to an integer.

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

    Analysis:

    基本字符
    I
    V
    X
    L
    C
    D
    M
    相应的阿拉伯数字表示为
    1
    5
    10
    50
    100
    500
    1000
    • 个位数举例
      Ⅰ-1、Ⅱ-2、Ⅲ-3、Ⅳ-4、Ⅴ-5、Ⅵ-6、Ⅶ-7、Ⅷ-8、Ⅸ-9
    • 十位数举例
      Ⅹ-10、Ⅺ-11、Ⅻ-12、XIII-13、XIV-14、XV-15、XVI-16、XVII-17、XVIII-18、XIX-19、XX-20、XXI-21、XXII-22、XXIX-29、XXX-30、XXXIV-34、XXXV-35、XXXIX-39、XL-40、L-50、LI-51、LV-55、LX-60、LXV-65、LXXX-80、XC-90、XCIII-93、XCV-95、XCVIII-98、XCIX-99
    • 百位数举例
      C-100、CC-200、CCC-300、CD-400、D-500、DC-600、DCC-700、DCCC-800、CM-900、CMXCIX-999
    • 千位数举例
      M-1000、MC-1100、MCD-1400、MD-1500、MDC-1600、MDCLXVI-1666、MDCCCLXXXVIII-1888、MDCCCXCIX-1899、MCM-1900、MCMLXXVI-1976、MCMLXXXIV-1984、MCMXC-1990、MM-2000、MMMCMXCIX-3999

     Solution 1: 借助map

     1 class Solution {
     2 public:
     3     int romanToInt(string s) {      //runtime:76ms
     4         int ret=0;
     5         map<char,int> m;
     6         m['I']=1;m['V']=5;m['X']=10;m['L']=50;m['C']=100;m['D']=500;m['M']=1000;
     7         for(int i=1;i<s.size();i++){
     8             if(m[s[i]]<=m[s[i-1]])ret+=m[s[i-1]];
     9             else
    10                 ret-=m[s[i-1]];
    11         }
    12         ret+=m[s[s.size()-1]];
    13         return ret;
    14     }
    15 };

    Solution 2: 每个字符前的字符确定,C前只可能是C或X,M前只可能是M或C

     1 class Solution {
     2 public:
     3     int romanToInt(string s) {      //runtime: 36ms
     4         int n = 0;
     5         char lastC = 0;
     6         for(int i = 0; i < s.size(); i ++)
     7         {
     8             switch(s[i])
     9             {
    10                 case 'I':
    11                     n += 1;     
    12                     lastC = s[i];
    13                     break;
    14                 case 'V':
    15                     if(lastC == 'I')
    16                     {//IV
    17                         n -= 1;
    18                         n += 4;
    19                         lastC = 0;
    20                     }
    21                     else
    22                     {
    23                         n += 5;     
    24                         lastC = s[i];   
    25                     }
    26                     break;
    27                 case 'X':
    28                     if(lastC == 'I')
    29                     {//IX
    30                         n -= 1;
    31                         n += 9;
    32                         lastC = 0;
    33                     }
    34                     else
    35                     {
    36                         n += 10;  
    37                         lastC = s[i];
    38                     }
    39                     break;
    40                 case 'L':
    41                     if(lastC == 'X')
    42                     {//XL
    43                         n -= 10;
    44                         n += 40;
    45                         lastC = 0;
    46                     }
    47                     else
    48                     {
    49                         n += 50;  
    50                         lastC = s[i];
    51                     }
    52                     break;
    53                 case 'C':
    54                     if(lastC == 'X')
    55                     {//XC
    56                         n -= 10;
    57                         n += 90;
    58                         lastC = 0;
    59                     }
    60                     else
    61                     {
    62                         n += 100;   
    63                         lastC = s[i];   
    64                     }
    65                     break;
    66                 case 'D':
    67                     if(lastC == 'C')
    68                     {//CD
    69                         n -= 100;
    70                         n += 400;
    71                         lastC = 0;
    72                     }
    73                     else
    74                     {
    75                         n += 500;
    76                         lastC = s[i];
    77                     }
    78                     break;
    79                 case 'M':
    80                     if(lastC == 'C')
    81                     {//CM
    82                         n -= 100;
    83                         n += 900;
    84                         lastC = 0;
    85                     }
    86                     else
    87                     {
    88                         n += 1000;
    89                         lastC = s[i];
    90                     }
    91                     break;
    92                 default:
    93                     return 0;
    94             }
    95         }
    96         return n;
    97     }
    98 };
  • 相关阅读:
    赤手空拳破解WINDOWS系统密码
    几扇鲜为人知的Windows XP自动运行后门
    Enumerating Logon Sessions
    用浏览器控件做界面,网页界面中定义自己的程序事件
    P2P之UDP穿透NAT的原理与实现(附源代码)
    delphi调用c#写的webservice中文出现乱码的问题
    基于Delphi的DirectShow开发概述
    视频捕获软件开发完全教学
    GINA 模块定义文件(Windows XP)
    GINA后门代码
  • 原文地址:https://www.cnblogs.com/irun/p/4712311.html
Copyright © 2020-2023  润新知