美文网首页
13. Roman to Integer

13. Roman to Integer

作者: Al73r | 来源:发表于2017-09-21 08:53 被阅读0次

    题目

    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;  
    }  
    

    相关文章

      网友评论

          本文标题:13. Roman to Integer

          本文链接:https://www.haomeiwen.com/subject/cxzasxtx.html