13. Roman to Integer

题目

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;  
}  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容