zoukankan      html  css  js  c++  java
  • leetcode第一刷_Integer to Roman

    这道题当时不会写,是參照discuss写的。

    首先要弄明确罗马数字的规则,这个在国外难道是常识吗。为什么题干一点都没讲。。

    4000以下一共同拥有以下几种符号:"M", "D", "C", "L", "X", "V", "I",相应到我们十进制为:1000, 500, 100, 50, 10, 5, 1。另一条很重要的规则,就是相同的字符最多反复出现三次。这就决定了数位上带4和9的跟普通的数值不一样。数位上4的做法是在比当前数位大5倍的字符左边放一个当前数位表示1的那个字符。比如个位上的四是IV。十位上的四是XL等等。

    9跟四类似,仅仅只是是在比当前数位大10倍的那个字符左边放一个当前数位表示1的那个字符。

    好。以下讲一下如何把一个数字num转化成罗马数字res。我们从千位開始往前看。假设当前的底比num要大,按理说应该减小底的。可是有个情况,就是下一位假设是个9的且当前位置是以1开头的数字,比方1000,100等,那么res下一个数位应该用base+2 base的形式来表示。假设当前base是以1开头的且num的当前数位是4的时候。res的这个位应该用base base-1。除了是4的这样的情况。且当前数位比base要大,那么就在res后面加上base。假设这些情况都不满足,也即base并非以1开头的或者后面接的不是9,都是直接降低base。要注意,每当更新了res之后,要把用掉的那部分数从num中减掉。

    说了这么多,事实上还是代码直观一些:

    string bit[7] = {"M", "D", "C", "L", "X", "V", "I"};
    int mref[7] = {1000, 500, 100, 50, 10, 5, 1};
    
    class Solution {
    public:
        string intToRoman(int num) {
            string res = "";
            int base = 0;
            while(num){
                if(base%2==0 && num/mref[base]==4){
                    res += bit[base];
                    res += bit[base-1];
                    num -= 4*mref[base];
                }else if(num>=mref[base]){
                    res += bit[base];
                    num -= mref[base];
                }else if(base%2==0 && num/mref[base+2]==9){
                    res += bit[base+2];
                    res += bit[base];
                    num -= mref[base+2]*9;
                }else{
                    base++;
                }
            }
            return res;
        }
    };


  • 相关阅读:
    树——题解汇总
    element ui实现手动上传文件,且只能上传单个文件,并能覆盖上传
    浏览器缓存
    websocket协议
    session
    cookie
    作用域插槽
    时间格式化函数
    Neo4j快速入门
    线性空间
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/6710469.html
Copyright © 2011-2022 走看看