leetcode 12.整数转罗马数字

Posted 战火的小雨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 12.整数转罗马数字相关的知识,希望对你有一定的参考价值。

学习到了新算法,新思想。

哎,没啥说的,下面直接展示一下刚开始写的代码,有点笨…

**暴力枚举**o(╥﹏╥)o
// An highlighted block
char reNum[15];
char * intToRoman(int num){
    int index=0;
    int tempNum=0;
    if(num/1000>0)
    {
        tempNum=num/1000;
        while(tempNum--)
        {
            reNum[index++]='M';
        }
        num%=1000;
    }
    if(num/900==1)
    {
        reNum[index++]='C';
        reNum[index++]='M';
        num=num-900;
    }
    else if(num/500>0)
    {
        reNum[index++]='D';
        num-=500;
    }
    else if(num/400==1)
    {
        reNum[index++]='C';
        reNum[index++]='D';
        num-=400;
    }
    if(num/100>0)
    {
        tempNum=num/100;
        while(tempNum--)
        {
            reNum[index++]='C';
        }
        num%=100;
    }
    if(num/90==1)
    {
        reNum[index++]='X';
        reNum[index++]='C';
        num-=90;
    }
    else if(num/50>0)
    {
        reNum[index++]='L';
        num-=50;
    }
    else if(num/40>0)
    {
        reNum[index++]='X';
        reNum[index++]='L';
        num-=40;
    }
    if(num/10>0)
    {
        tempNum=num/10;
        while(tempNum--)
        {
            reNum[index++]='X';
        }
        num%=10;
    }
    if(num/9>0)
    {
        reNum[index++]='I';
        reNum[index++]='X';
        num-=9;
    }
    else if(num/5>0)
    {
        reNum[index++]='V';
        num-=5;
    }
    if(num/4>0)
    {
        reNum[index++]='I';
        reNum[index++]='V';
        num-=4;
    }
    else if(num/1>0)
    {
        tempNum=num/1;
        while(tempNum--)
        {
            reNum[index++]='I';
        }
    }
    return reNum;
}

真是给我自己都有点烦了,我写的时候就感觉这题不应该这样傻傻的枚举,如果真是这样,那不就很low么。

ε=(´ο`*)))唉,果然一看答案依旧是豁然开朗。

// 看完答案后自己写的代码

const char* Luo[]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
const int fLuo[]={1000,900,500,400,100,90,50,40,10,9,5,4,1};
char * intToRoman(int num){
    char* reNum=malloc(sizeof(char)*16);
    int i=0;
    reNum[0]='\\0';
    while(num>0)
    {
        if(num>=fLuo[i])
        {
            num-=fLuo[i];
            strcpy(reNum+strlen(reNum),Luo[i]);
        }
        else
        {
            i++;
        }
    }
    return reNum;
}

这就是差距,看来路漫漫其修远兮。

下面才是重点
思考一下
首先,先知道
C 库函数
1、 char *strcat(char *dest, const char *src) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。
2、 char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest。
3、 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。

好了,下面回到这道题当中。
我现在才发现,我最上面用的枚举,好像就是这道题的简单解法的思路,只是 我没有从中找到规律…难受。

额刚才我又发现一个惊人的事实,官方还给另一种解法。


const char* thousands[] = {"", "M", "MM", "MMM"};
const char* hundreds[] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
const char* tens[] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
const char* ones[] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};

char* intToRoman(int num) {
    char* roman = malloc(sizeof(char) * 16);
    roman[0] = '\\0';
    strcpy(roman + strlen(roman), thousands[num / 1000]);
    strcpy(roman + strlen(roman), hundreds[num % 1000 / 100]);
    strcpy(roman + strlen(roman), tens[num % 100 / 10]);
    strcpy(roman + strlen(roman), ones[num % 10]);
    return roman;
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/integer-to-roman/solution/zheng-shu-zhuan-luo-ma-shu-zi-by-leetcod-75rs/

官方给的说明:
千位数字只能由 M 表示;
百位数字只能由C,CD,D 和CM 表示;
十位数字只能由 X,XL,L 和 XC 表示;
个位数字只能由 I,IV,V 和 \\IX 表示。

我只能说我人傻了,这个规律我差不多也算找到了,不信可以看上面我用的是if,else if,其实我也是有思考的,可结果我一个简单方法都没用出来,这不禁让我思考:到底是思考的太少,还是刷题的太少。maybe两者都有o(╥﹏╥)o。
综上,这道题的小收获是:以后可以把一些固定的有顺序的变量(也不一定)放在一个数组中(建个表)(依旧画个重点)。
今天就到这里了,ヾ(•ω•`)o 。

以上是关于leetcode 12.整数转罗马数字的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode12. 整数转罗马数字(贪心)

LeetCode 12 - 整数转罗马数字 - [简单模拟]

leetcode 12.整数转罗马数字

leetcode 12.整数转罗马数字

leetcode 12.整数转罗马数字

leetcode 12.整数转罗马数字