zoukankan      html  css  js  c++  java
  • 【leetcode刷题笔记】Integer to Roman

    Given an integer, convert it to a roman numeral.

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


    题解:基本的罗马字符和数字对应如下表所示:

    罗马字符 数字
    I 1
    V 5
    X 10
    L 50
    C 100
    D 500
    M 1000

    每隔一个字符又可以与相邻的两个字符组成一个新的数,例如I可以和V和X组成IV和IX,这样又可以生成6个数字,如下表:

    罗马字符 数字
    IV 4
    IX 9
    XL 40
    XC 90
    CD 400
    CM 900

    接下来我们用numbers记录上述13个数字,symbol数组记录上述13个符号,然后从最大的数1000开始,一步步将num转换成数字。

    数字3012的转换过程如下:

    1. 3012/1000 = 3,answer = MMM,num <- 3012-3000=12;
    2. 12/900=0; 12/500 = 0; ......
    3. 12/10 = 1, answer = MMM+X=MMMX, num <- 12 - 10 = 2;
    4. 2/9 = 0,; 2/5 = 0; 2/4 = 0;
    5. 2/1 = 2, answer = MMMX+II = MMMXII, num <- 2-2 = 0;

    所以3012对应的罗马数字为MMMXII。

    代码如下:

     1 public class Solution {
     2     public String intToRoman(int num) {
     3         if(num <= 0)
     4             return "";
     5         
     6         int[] numbers = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
     7         String[] symbol = {"M","CM","D","CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
     8         
     9         StringBuffer answer = new StringBuffer();
    10         int digit = 0;
    11         while(num > 0){
    12             int times = num / numbers[digit];
    13             for(int i = 0;i < times;i++)
    14                 answer.append(symbol[digit]);
    15             num = num - numbers[digit] * times;
    16             digit++;
    17         }
    18         return answer.toString();
    19     }
    20 }
  • 相关阅读:
    CodeForces 7B
    CodeForces 4D
    离散化
    线段树入门
    洛谷 P3951 小凯的疑惑(赛瓦维斯特定理)
    Codeforces 1295D Same GCDs (欧拉函数)
    Codeforces 1295C Obtain The String (二分)
    Codeforces 1295B Infinite Prefixes
    Codeforces 1295A Display The Number(思维)
    Codeforces 1294F Three Paths on a Tree(树的直径,思维)
  • 原文地址:https://www.cnblogs.com/sunshineatnoon/p/3856057.html
Copyright © 2011-2022 走看看