题目链接:https://leetcode-cn.com/problems/count-and-say/
参考博客:https://www.cnblogs.com/flix/p/13166787.html
题目描述:
解题思路:
理解一下题目的意思,外观数列是一个整数序列,从数字1开始,序列中的每一项都是对前一项的描述。我们需要根据输入的n,输出外观数组的第n项(n从1开始)。
使用迭代来做,以根据第三项21求第4项作为例子。首先设置当前的数字为2项的第一个字符2,以及当前数字2连续出现多少次cnt,初始化为1,然后开始循环,如果下一个数字也是2,则cnt++;否则,将2[cnt]放进对该项的描述当中([cnt]表示cnt的值,例如这里cnt为1,所以将“21”放入下一个项中),然后将下一个数字作为当前的数字,将cnt重置为1。这是求相邻两项的步骤,因为要求第n项,所以需要将上面的步骤循环n次。代码如下:
class Solution { public: string countAndSay(int n) { string pre = "1"; // 前一个字符串 for(int i=1; i<n; i++){ string cur = ""; // 当前的字符串,用于描述前一个字符串 char curNum = pre[0]; // 当前的字符 int curNumCnt = 1; // 当前字符的计数 for(int j=1; j<pre.length(); j++){ if(pre[j]==curNum) curNumCnt++; else{ cur += to_string(curNumCnt)+curNum;//将cnt转化为字符串 curNum = pre[j]; curNumCnt = 1; } } cur += to_string(curNumCnt); // 注意这两步别忘了 cur.push_back(curNum); pre = cur; } return pre; } };
注:
这里用到了push_back()函数,c++中push_back()函数的用法
函数将一个新的元素加到vector的最后面,位置为当前的最后一个元素的下一个元素
push_back()在Vector的最后添加一个元素(参数为要插入的值)
//在vec尾部添加10 vector<int> vec; vec.push_back(10);
//在容器中添加10 int num = 10; vector<int> vec; vec.push_back(num);
或者在string中最后插入一个字符:
string str; str.push_back('d');
类似的:
pop_back() //移除最后一个元素
clear() //清空所有元素
empty() //判断vector是否为空,如果返回true则为空
erase() //删除指定元素