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.整数转罗马数字的主要内容,如果未能解决你的问题,请参考以下文章