前言
- 文章作为日记或心得,记录学习过程
- 本文记录本题(源自LeetCode)遇到的所有问题、疑惑
- 如对内容有任何建议或看法,欢迎评论区学习交流
正文
题目
解答
六种特殊情况,对于每种表示,其只会出现一次。用所有对应的小写字母代表他们出现的次数,均初始化为0
用m记录M出现的次数,若有CM,则cm=1,则其值为m_=m*1000-cm*100;
用d记录D出现的次数,若有CD,则cd=1,则其值为d_=d*500-cd*100;
用c记录C出现的次数,若有XC,则xc=1,则其值为c_=(c-cm-cd)*100-xc*10;
用l记录L出现的次数,若有XL,则xl=1,则其值为l_=l*50-xl*10;
用x记录X出现的次数,若有IX,则ix=1,则其值为x_=(x-xc-xl)*10-ix;
用v记录V出现的次数,若有IV,则iv=1,则其值为v_=v*5-iv;
用i记录I出现的次数,其值为i_=(i-ix-iv).
最后的结果即为m_+d_+c_+l_+x_+v_+i_
按照上述思路执行以下代码
class Solution
{
public:
int romanToInt(string s)
{
int m = 0, d = 0, c = 0, l = 0, x = 0, v = 0, i = 0;
int cm = 0, cd = 0, xc = 0, xl = 0, ix = 0, iv = 0;
int m_ = 0, d_ = 0, c_ = 0, l_ = 0, x_ = 0, v_ = 0, i_ = 0;
for (size_t j = 0; j < s.length(); j++)
{
if (s[j] == 'M')
m++;
if (s[j] == 'D')
d++;
if (s[j] == 'C')
c++;
if (s[j] == 'L')
l++;
if (s[j] == 'X')
x++;
if (s[j] == 'V')
v++;
if (s[j] == 'I')
i++;
}
int cm_ = s.find("CM");
if (cm_ != s.npos)
cm = 1;
int cd_ = s.find("CD");
if (cd_ != s.npos)
cd = 1;
int xc_ = s.find("XC");
if (xc_ != s.npos)
xc = 1;
int xl_ = s.find("XL");
if (xl_ != s.npos)
xl = 1;
int ix_ = s.find("IX");
if (ix_ != s.npos)
ix = 1;
int iv_ = s.find("IV");
if (iv_ != s.npos)
iv = 1;
m_ = m * 1000 - cm * 100;
d_ = d * 500 - cd * 100;
c_ = (c - cm - cd) * 100 - xc * 10;
l_ = l * 50 - xl * 10;
x_ = (x - xc - xl) * 10 - ix;
v_ = v * 5 - iv;
i_ = (i - ix - iv);
return m_ + d_ + c_ + l_ + x_ + v_ + i_;
}
};
一次通过
结果
问题
仍然是string的相关操作不熟练
string.find()
在寻找子字符串的过程中,最后选取的.find()函数是可以完成的,函数参数为子字符串,返回的是首次出现的位置,若不存在,则返回一个特别的标记.npos。王陸给了更详细的解释。
strstr()
在用.find()之前,还尝试了strstr的方法
string s = "123";
char* f = strstr(s, "12");
int l = strlen(s);
报错如下
尝试以下代码,没报错。突然好像明白哪错了
char s[] = "123";
char* f = strstr(s, "12");
int l = strlen(s);
区别
char和string的函数不一样,在查找子串时的函数存在区别。
对于string就是.find();对于char就是strstr()。参考
string s = "123";
int f = s.find("12");//直接返回位置
if (f != s.npos)//未找到时的判断
//后续操作
char s[] = "123";
char *f = strstr(s, "12");//返回的是子串的地址
if(f != NULL)//未找到时的判断
int location = f - s;//这才可以知道位置
看来还是基础没有掌握好。
后来发现
string s = "123";
int f = s.find("12");//直接返回位置
if (f != -1)//也可以,如果没找到,其返回值就是-1.以后就用-1判断吧,好理解一点。
//后续操作