高端网站设计报价表,凡科网怎么建网站,多用户商城数据库设计,淘宝客网站建设任务关键词#xff1a;to_string, string.size(), string.length()
1.题目 2.解答思路及解答
解答思路#xff1a; 首先#xff0c;罗马数字表达中和常规数学表达类似#xff0c;基本是按照从后往前#xff0c;从小到大排列。因此#xff0c;理论上只需要从后往前相加即可。… 关键词to_string, string.size(), string.length()
1.题目 2.解答思路及解答
解答思路 首先罗马数字表达中和常规数学表达类似基本是按照从后往前从小到大排列。因此理论上只需要从后往前相加即可。 受限于几种特殊情况根据相加的顺序如果是从小到大从右往左从下标大到小时特殊情况IVIXXLXCCDCM则特殊考虑即遇到V、X判断左侧是否有I否则特殊处理没有I时正常处理其他情况类似。 需要注意的不仅是思路问题本题从左往右相加也可计算但是时刻需要注意下标溢出问题。
class Solution {
public:int romanToInt(string s) {int iSize s.size();int iSum 0;for(int i iSize - 1; i 0; --i){if(s[i] I){iSum 1;}else if(s[i] V){if(i-1 0 s[i-1] I){iSum 4;--i;}else{iSum 5;}}else if(s[i] X){if(i-10 s[i-1] I){iSum 9;--i;}else{iSum 10;}}else if(s[i] L){if(i-10 s[i-1] X){iSum 40;--i;}else{iSum 50;}}else if(s[i] C){if(i-10 s[i-1] X){iSum 90;--i;}else{iSum 100;}}else if(s[i] D){if(i-10 s[i-1] C){iSum 400;--i;}else{iSum 500;}}else if(s[i] M){if(i-10 s[i-1] C){iSum 900;--i;}else{iSum 1000;}}//end for}return iSum;//end fun}
//end class
};
3.优秀答案
答案1map比对 该答案中利用map解决了常规思路中需要逐个if判断字母和对应特殊情况的问题理论上switch就是多个if的语句可以替代if然而switch只能分类数字而不能进行字母分类。 而且巧妙总结了罗马数字的规律如果小的数字放在大数字左边就等于大数字减小数字的结果。
class Solution {
private:unordered_mapchar, int symbolValues {{I, 1},{V, 5},{X, 10},{L, 50},{C, 100},{D, 500},{M, 1000},};public:int romanToInt(string s) {int ans 0;int n s.length();for (int i 0; i n; i) {int value symbolValues[s[i]];if (i n - 1 value symbolValues[s[i 1]]) {ans - value;} else {ans value;}}return ans;}
};作者力扣官方题解
链接https://leetcode.cn/problems/roman-to-integer/solutions/774992/luo-ma-shu-zi-zhuan-zheng-shu-by-leetcod-w55p/
来源力扣LeetCode
著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。
4.技术总结
1 unordered_mapchar,int XXX{ {‘I’1} {‘V’5} {‘X’10} } map,XXX[char]返回int