我尝试了以下操作: 计数序列是从以下开始的整数序列:
1、11、21、1211、111221,... 1被读为1或11。 11被读出为两个1或21。
21读为1,然后是1或1211。
给出一个整数n,生成第n个序列。
我实际上写了一些代码来解决这个问题,但是并没有产生正确的答案。代码中的问题是我试图使用“ +”运算符在字符串中添加一个字符。
string Solution::countAndSay(int A)
{
string s = "11";
string str;
string ans[A + 2];
ans[1] = "1";
ans[2] = "11";
int count = 1;
for (int j = 3; j <= A; j++) {
str = "";
count = 1;
for (int i = 0; i < s.size() - 1; i++) {
if (s[i] == s[i + 1])
count++;
else {
str += to_string(count) + s[i];
count = 1;
}
}
if (s[s.size() - 1] != s[s.size() - 2]) {
str += "1" + s[s.size() - 1];
}
else
str += to_string(count) + s[s.size() - 1];
ans[j] = str;
s = str;
}
return ans[A];
}
当我在嵌套循环中的以下if条件内更改代码时,它起作用了。我所做的更改是:
if(s[s.size()-1]!=s[s.size()-2]){
str+="1";
str.push_back(s[s.size() - 1)];
}
我只想知道早期代码中的错误。我们不能使用“ +”运算符在字符串中添加字符吗?
答案 0 :(得分:1)
str += "1" + s[s.size() - 1];
不是不是是指
str += "1";
str += s[s.size() - 1];
但是
str += ("1" + s[s.size() - 1]);
右侧表达根本不是您想要的。
表达式"1"
不是一个char,而是一个包含两个字符{'1', 0}
的字符串文字(它是C字符串,所以有一个空终止符)。
然后,"1" + ...
不同于您的顶级操作,因为C字符串没有重载的运算符,而只是衰减到指针。
现在您正在执行指针算术,因此s[s.size() - 1]
从一个字符提升为一个整数,并添加到字符串文字中第一个字符的地址。
除非字符为0
或1
(并且我不是说'0'
或'1'
),否则结果不在字符串文字的结尾,并且行为将是不确定的。
str += (...)
现在正在附加一个C字符串,甚至不能查看它(由于上述UB)。
原因
str += to_string(count) + s[i];
起作用的原因是to_string(count) + s[i]
的左侧是一个std::string
,其中的operator+
已重载。您可以通过写作获得相同的效果
str += string{"1"} + s[s.size() - 1];
因此,在std::string
的左侧,您还有一个operator+
而不是C字符串文字。