The count-and-say sequence is the sequence of integers with the first five terms as following:
1. 1 2. 11 3. 21 4. 1211 5. 111221
1
is read off as "one
1"
or 11
.
11
is read off as "two
1s"
or 21
.
21
is read off as "one
2
, then one 1"
or 1211
.
Given an integer n, generate the nth term of the count-and-say sequence.
Note: Each term of the sequence of integers will be represented as a string.
Example 1:
Input: 1 Output: "1"
Example 2:
Input: 4 Output: "1211"
看到这个题的时候有点蒙圈,不知道是要干啥。。。让我来简单粗暴的翻译一下吧。
当n == 1的时候,字符串是“1”,读作“一个1”, 写作“11” (第一个1表示数量,第二个1表示数字,加起来就是一个1),于是有了下一个字符串;
当n == 2的时候,字符串是“11”,读作“两个1”,写作“21”
当n == 3的时候,字符串是“21”, 读作“一个2一个1”,写作“1211”
以此类推。
这个题没啥说的就是统计上一个字符串中同样数字出现的次数,我使用了两根指针的思路。
代码如下:
class Solution {
public:
string countAndSay(int n) {
string oldNum = "1";
if (n == 1) return oldNum;
for (int i = 2; i <= n; i++) {
int start = 0;
string newNum = "";
while (start < oldNum.length()) {
int numberLen = 0;
int end = start;
while (end < oldNum.length() && oldNum[start] == oldNum[end]) {
numberLen++;
end++;
}
newNum += '0' + numberLen;
newNum += oldNum[start];
start = end;
}
oldNum = newNum;
}
return oldNum;
}
};
做这个题的过程中发现了自己知识的一个漏洞,那就是十分简单的char转换为string,居然想了半天。-.-
其实只要简单相加即可:
char c = 'a';
string s = "hello world";
cout << s + c << endl;