题目描述
罗马数字转整数,包含以下七种字符: I, V, X, L,C,D 和 M。分别对应1,5,10,50,100,500,1000。
- I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
- X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
- C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
思路
将每一个对应罗马数字转换成数字,一个一个加起来。当小数字在大数字前时,需要减法。
eg:罗马数字IV,就是V-I,即5-1=4,其他正常叠加
难点
数字转换
方法
使用数组,给每一个罗马数字对应下标,每个下标在数组中对应值。
int romanToInt(char * s){
int num[26];// 优点在于利用ASCII码,数组空间尽可能小,也更能理解
num['I' - 'A'] = 1;
num['V' - 'A'] = 5;
num['X' - 'A'] = 10;
num['L' - 'A'] = 50;
num['C' - 'A'] = 100;
num['D' - 'A'] = 500;
num['M' - 'A'] = 1000;
int result = 0, len = strlen(s);
for(int i = 0; i < len; i++){
int value = num[s[i] - 'A'];
if(i < len-1 && value < num[s[i+1] - 'A']){
result -= value;
}else{
result += value;
}
}
return result;
}
java版本(题解中一个很好的思路)
该方法避免了在数字相加时进行判断,直接++
class Solution {
public int romanToInt(String s) {
// 优点在于将6种较为特殊的情况提前转化,在switch中进行判断即可,避免了小数字在大数字前的判断,且减少了switch语句判断的次数。
// 缺点在于当特例足够多时,会变得臃肿,不及+-判断精简
s = s.replace("IV","a");
s = s.replace("IX","b");
s = s.replace("XL","c");
s = s.replace("XC","d");
s = s.replace("CD","e");
s = s.replace("CM","f");
int result = 0;
for(int i = 0;i < s.length(); i++){
result += getValue(s.charAt(i));
}
return result;
}
private int getValue(char c) {
switch(c) {
case 'I' : return 1;
case 'V' : return 5;
case 'X' : return 10;
case 'L' : return 50;
case 'C' : return 100;
case 'D' : return 500;
case 'M' : return 1000;
case 'a' : return 4;
case 'b' : return 9;
case 'c' : return 40;
case 'd' : return 90;
case 'e' : return 400;
case 'f' : return 900;
}
return 0;
}
}
吐槽一下个人代码问题
- 习惯于return 0,导致运行结果不符合预期,多return了一个0
- 大小写问题,V和v的问题,导致ASCII码变化,计算结果不符合预期
本文由 szr 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Sep 14, 2021 at 07:44 pm
usa cialis sales order tadalafil sale herbal ed pills
order tadalafil 10mg pill cost cialis 10mg can you buy ed pills online
I intended to write you this little note to finally give many thanks as before for these awesome tips you've documented at this time. This has been really particularly generous of people like you to give openly all that a lot of people could have made available for an ebook to help with making some cash for themselves, mostly now that you could possibly have done it if you wanted. These points as well acted as a fantastic way to understand that some people have similar zeal like my very own to know the truth more and more with regard to this condition. Certainly there are lots of more pleasurable moments in the future for individuals who scan through your blog.
I intended to put you a little bit of observation to finally say thanks yet again for your beautiful principles you have shown in this case. It has been simply remarkably open-handed of you to allow without restraint all that numerous people might have advertised as an e-book in order to make some profit for their own end, principally since you might well have tried it in the event you considered necessary. The points as well worked to be a fantastic way to be aware that some people have similar passion similar to mine to know a good deal more with respect to this condition. I know there are many more enjoyable opportunities ahead for individuals who read your website.
A lot of thanks for your entire effort on this website. Kate enjoys managing investigations and it's really obvious why. Most people hear all relating to the lively medium you make worthwhile things on the blog and welcome response from some others on that point and our child has been being taught a great deal. Take advantage of the rest of the new year. Your carrying out a powerful job.
Needed to create you one little observation to say thank you the moment again for those awesome strategies you have provided above. This has been really unbelievably open-handed with people like you to provide extensively all that many people could possibly have sold for an e book to generate some dough on their own, particularly considering the fact that you could possibly have done it if you ever wanted. Those suggestions in addition worked like the great way to know that the rest have the identical desire just as my very own to find out very much more pertaining to this issue. I am certain there are several more pleasant moments up front for many who look into your blog post.
I just wanted to thank you for the fast service. also known as they look great. I received them a day earlier than expected. for instance the I will definitely continue to buy from this site. blue jays I will recommend this site to my friends. Thanks!
cheap jordan shoes https://www.cheaprealjordan.com/
I just wanted to thank you for the fast service. potentially they look great. I received them a day earlier than expected. since the I will definitely continue to buy from this site. direction I will recommend this site to my friends. Thanks!
cheap jordan shoes https://www.cheaprealjordan.com/
I just wanted to thank you for the fast service. and it could be they look great. I received them a day earlier than expected. cherish the I will definitely continue to buy from this site. in either case I will recommend this site to my friends. Thanks!
www.bestlouisvuittonoutlet.com https://www.bestlouisvuittonoutlet.com/
I just wanted to thank you for the fast service. and even they look great. I received them a day earlier than expected. similar to I will definitely continue to buy from this site. anyway I will recommend this site to my friends. Thanks!
cheap retro jordans https://www.cheaprealjordan.com/