题目
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
分析
思路很简单。从字符串的最后往前扫,并且从小到大对比罗马字母表。在每次对比时同事考虑下一位有没有可能是做减法的字母(对比'I'时除外),最终得到结果。
实现
class Solution {
public:
int romanToInt(string s) {
char symbol[]={'I', 'V', 'X', 'L', 'C', 'D', 'M'};
int radix[]={1,5,10,50,100,500,1000};
int ans=0, idx=s.size()-1;
for(int i=0; i<7; i++){
while(idx>=0 && s[idx]==symbol[i]){
if(idx>=1 && i>=1 && s[idx-1]==symbol[(i-1)/2*2]){
idx -= 2;
ans += radix[i] - radix[(i-1)/2*2];
}
else{
idx--;
ans += radix[i];
}
}
}
return ans;
}
};
思考
本来可以多写几个while循环来完成的。不过这里用了下面这个小技巧,将两个循环统一起来。
symbol[(i-1)/2*2]
总体感觉写得还是不错的,除了写得比较慢之外=_=
改进的地方也有,就是使用map,抛弃索引i代码会更简洁。
另外,看题解的时候看到了size_t和auto,分别查了一下。
size_t和unsigned int有所不同,size_t的取值range是目标平台下最大可能的数组尺寸,一些平台下size_t的范围小于int的正数范围,又或者大于unsigned int.最典型的,在x64下,int还是4,但size_t是8.这意味着你在x64下最大可能开辟的数组尺寸是2^64.如果你使用int或者unsigned int,那么在x64下如果你的代码中全部使用uint作为数组的尺寸标记,那么你就会失去控制232尺寸以上的数组的机会.虽然现在在x64上开辟一个大于232大小的连续数组依然是个不大可能的事情,但是..........“640K内存对于任何人来说都足够了”----比尔盖茨
作者:KE meng
链接:https://www.zhihu.com/question/24773728/answer/28920149
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
c++11中auto的资料
http://blog.csdn.net/hackmind/article/details/24271949
以后遍历数组什么的可以用下面的语句了,简直要飞起来~~
for(auto ch : str) {
std::cout << ch << std::endl;
}