leetcode第12题

简介: 相当简洁了,主要就是把所有的组合列出来,因为罗马数字表示的大小就是把所有字母相加,所以每次 append 那个,再把对应的值减去就行了。时间复杂度:不是很清楚,也许是 O(1)?因为似乎和问题规模没什么关系了。空间复杂度:O(1)

image.png

top12

把数字转换成罗马数字,正常情况就是把每个字母相加,并且大字母在前,小字母在后,上边也介绍了像 4 和 9 那些特殊情况。

解法一

这个是自己的解法,主要思想就是每次取出一位,然后得到相应的罗马数字,然后合起来就行。

publicStringgetRoman(intnum,intcount){ //count 表示当前的位数,个位,十位...char[]ten={'I','X','C','M'}; //1,10,100,1000char[]five={'V','L','D'};//5,50,500Stringr="";
if(num<=3){
while(num!=0){
r+=ten[count];
num--;
        }
    }
if(num==4){
r=(ten[count]+"")+(five[count]+"");
    }
if(num==5){
r=five[count]+"";
    }
if(num>5&&num<9){
r=five[count]+"";
num-=5;
while(num!=0){
r+=ten[count];
num--;
        }
    }
if(num==9){
r= (ten[count] +"") + (ten[count+1] +"");
    }
returnr;
}
publicStringintToRoman(intnum) {
Stringr="";
intcount=0;
while(num!=0){
intpop=num%10;
r=getRoman(pop,count)+r;
count++;
num/=10;
    }
returnr;
}

时间复杂度:num 的位数 log_{10}(num)+1log10(num)+1所以时间复杂度是 O(log(n))。

空间复杂度:常数个变量,O(1)。

下边在分享一些 LeetCode 讨论里的一些解法。

解法二

https://leetcode.com/problems/integer-to-roman/discuss/6310/My-java-solution-easy-to-understand

publicStringintToRoman(intnum) {
int[] values= {1000,900,500,400,100,90,50,40,10,9,5,4,1};
String[] strs= {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
StringBuildersb=newStringBuilder();
for(inti=0;i<values.length;i++) {
while(num>=values[i]) {
num-=values[i];
sb.append(strs[i]);
        }
    }
returnsb.toString();
}

相当简洁了,主要就是把所有的组合列出来,因为罗马数字表示的大小就是把所有字母相加,所以每次 append 那个,再把对应的值减去就行了。

时间复杂度:不是很清楚,也许是 O(1)?因为似乎和问题规模没什么关系了。

空间复杂度:O(1).


这道题感觉难度应该是 easy ,没有那么难,就是理清楚题意,然后就可以往出列举就行了。

相关文章
|
4月前
leetcode-1518:换酒问题
leetcode-1518:换酒问题
28 0
|
1月前
|
算法
LeetCode第66题加一
LeetCode第66题"加一"的解题方法,通过遍历数组从后向前处理每一位的加法,并考虑进位情况,最终实现给定数字加一的功能。
LeetCode第66题加一
|
存储
leetcode:53.最大字序和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
45 0
顺手牵羊(LeetCode844.)
好多同学说这是双指针法,但是我认为叫它顺手牵羊法更合适
67 0
leetcode 827 最大人工岛
leetcode 827 最大人工岛
56 0
leetcode 827 最大人工岛
LeetCode 389. 找不同
给定两个字符串 s 和 t,它们只包含小写字母。
64 0
leetcode第37题
从上到下,从左到右遍历每个空位置。在第一个位置,随便填一个可以填的数字,再在第二个位置填一个可以填的数字,一直执行下去直到最后一个位置。期间如果出现没有数字可以填的话,就回退到上一个位置,换一下数字,再向后进行下去。
leetcode第37题
|
存储 算法
leetcode第49题
时间复杂度:两层 for 循环,再加上比较字符串,如果字符串最长为 K,总的时间复杂度就是 O(n²K)。 空间复杂度:O(NK),用来存储结果。 解法一算是比较通用的解法,不管字符串里边是大写字母,小写字母,数字,都可以用这个算法解决。这道题的话,题目告诉我们字符串中只有小写字母,针对这个限制,我们可以再用一些针对性强的算法。 下边的算法本质是,我们只要把一类的字符串用某一种方法唯一的映射到同一个位置就可以。
144 0
leetcode第49题
leetcode第39题
对回溯法又有了更深的了解,一般的架构就是一个大的 for 循环,然后先 add,接着利用递归进行向前遍历,然后再 remove ,继续循环。而解法二的动态规划就是一定要找到递进的规则,开始的时候就想偏了,导致迟迟想不出来。
leetcode第39题