LeetCode-Easy-Roman To Integer

###原题目
将I V C M 诸如此类的罗马数字输入后,转换成数字输出。
```cpp
Example
Symbol       Value
I             1
V             5
X             10
L             50
C             100
D             500
M             1000
Example 1:
Input: "III"
Output: 3
Example 2:
Input: "IV"
Output: 4
Example 3:
Input: "IX"
Output: 9
Example 4:
Input: "LVIII"
Output: 58
Explanation: L = 50, V= 5, III = 3.
Example 5:
Input: "MCMXCIV"
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
```
###自己的第一遍解法
这道题第一遍的时候没有看出头绪,还想着用ASCII码来匹配其中的单词,但是当我发现转换成字符不仅很麻烦后,就突然想到string是一个字符串,它可以用迭代器,然后我又去看了一下别人的java代码,就成了目前自己现在做出的样子
```cpp
class Solution {
public:
 int romanToInt(string s) {
     vector<int> num;
  int sum=0;
  for (auto beg = s.begin(); beg != s.end(); beg++) {
   switch (*beg)
   {
   case'I':
    num.push_back(1);
    break;
   case'V':
    num.push_back(5);
    break;
   case'X':
    num.push_back(10);
    break;
   case'L':
    num.push_back(50);
    break;
   case'C':
    num.push_back(100);
    break;
   case'D':
    num.push_back(500);
    break;
   case'M':
    num.push_back(1000);
    break;
   }
  }
  for (auto top = num.begin(); top != num.end(); top++) {
   if ((top != num.end() - 1) && (*top < *(top + 1)))
   {
    sum = sum - (*top);
   }
   else if ((top != num.end()-1) && (*top >= *(top + 1)))
   {
    sum = sum + (*top);
   }
   else if(top==num.end()-1)
   {
    sum = sum + (*top);
    return sum;
   }
  }
     return sum;
 }
};
```
其中的case是从论坛上的一位朋友的java代码得到的思路,然后在后面的迭代器阶段,还是一如既往的边界问题让人头疼,虽然我已经提前考虑了边界,并且成功,但是一个细节还是让我第一次的编译出错,就是在条件中,会先判断‘与&&’条件符号前面的,然后我将本应判定是否over的放在了后面,所以出现错误。
###网上的优秀代码
优化了一个代码,他用的unodermap,这种思维可以借鉴。毕竟要摆脱c的写法,多用容器。
###自我思考
这次的代码使用了case,这个东西对我帮助很大,也知道了迭代器是可以减小内存使用的,但是对于运行速度貌似没有什么帮助,而且必须注意它的边界问题。对于string一定要了解到它是一个可以使用迭代器的标准库类型表示可变长的字符序列。
posted @ 2020-01-01 21:22  Yekko  阅读(121)  评论(0编辑  收藏  举报