Count and Say

来源:互联网 发布:锐速windows破解版 编辑:程序博客网 时间:2024/06/06 18:16

题目名称
Count and Say—LeetCode链接

描述
The count-and-say sequence is the sequence of integers beginning as follows:
1, 11, 21, 1211, 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 sequence.

Note: The sequence of integers will be represented as a string.

分析
返回一个字符串:
当n=1时,返回1;
当n=2时,按照n-1=1返回的值1,读成“1个1”,返回11;
当n=3时,按照n-1=2返回的值11,读成“2个1”,返回21;
当n=4时,按照n-1=3返回的值21,读成“1个2,1个1”,返回1211;
当n=5时,按照n-1=4返回的值1211,读成“1个1,1个2,2个1”,返回111221;
······
这道题一开始不好理解,在看懂题目意思之后,会遇到几个问题:
1.形参为int类型,返回的类型为string,涉及到数据类型转换;
2.第n个返回值要根据第n-1个返回值确定;
3.返回值如何存储来方便计算。
对于这三个问题,分别采用如下方法:
1.stringstream 是 C++ 提供的另一个字串型的串流(stream)物件,它可以实现将整数转换成字符串。要使用 stringstream, 必須先加入這一行:

#include<sstream>

2.定义两个vector,分别保存n-1的返回值和n的返回值。
3.将返回值的各个字符先以int的形式存储在vector中。

       解决了这三个问题,本算法最关键的就是根据n-1的返回值求解n的返回值了,如果n为1时直接返回:当n>1时,先用一个nums存储i=2的各个位,用一个计数器count来计算相同数字出现的次数,temp存储i+1的各个位,然后将temp赋值给nums,让nums保存第i+1个返回值,再利用算法计算出下一个返回值,直到i=n.

C++代码

class Solution {public:string countAndSay(int n) {    stringstream res;    if(n==1){        res<<n;        return res.str();    }    int index=0;    int nums_res=0;    vector<int> nums(2,1);    for(int i=2;i<n;i++){        vector<int> temp;        int prev=nums[0];        int count=1;        for(int j=1;j<nums.size();j++){            if(nums[j]!=prev){                temp.push_back(count);                temp.push_back(prev);                prev=nums[j];                count=1;            }else{                count++;            }            if(j==nums.size()-1){                temp.push_back(count);                temp.push_back(prev);            }        }        nums=temp;    }    for(int k=0;k<nums.size();k++){        res<<nums[k];    }    return res.str();}};
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 融e联登录密码错三次怎么办 金融e家u盾密码忘了怎么办 用工行网银转账后想取消交易怎么办 工行融e借没有密码器怎么办 工行融e借密码器丢了怎么办 工行融e联手机登录密码忘记怎么办 领导给员工抱怨工作太烦怎么办 员工抱怨忙的忙死闲的闲死怎么办 爱上骗我进传销的人该怎么办 尚赫辟谷期间吃了东西怎么办 肾结石掉在输尿管里面好痛怎么办 寄的快递快递单号找不到了怎么办 手机停机但是快递是这个号码怎么办 百世通快递卡在一个地方没动怎么办 电信无限流量20g用完了怎么办 至尊宝qq密保手机被更换怎么办 至尊宝账户密保手机被改怎么办 照片放到私密相册找不到了怎么办 出口报关报错境内货源地怎么办? 微信提现未到账交易记录删了怎么办 支付宝忘记密码就可以登陆怎么办 电脑上登陆QQ忘记密码了怎么办? 电脑被管理员限制登录微信了怎么办 快手绑定的手机号丢了登不上怎么办 快手绑定的手机号丢了登不了怎么办 苹果id有手机号不知道密码怎么办 微信号不是手机号不知道密码怎么办 手机发短信说程序发生错误怎么办 派派游戏崇物等级低怎么办 轻微事故没有报警后面有问题怎么办 苹果6sp手机接电话声音小怎么办 用手机号办的移动宽带到期了怎么办 联通忘了宽带的用户名和密码怎么办 宽带联通移机附近没有端口怎么办 电信卡怎么改服务密码忘记了怎么办 路由器重置宽带账号密码忘了怎么办 重置路由器后不知道宽带密码怎么办 欠费后重新缴费宽带连接不了怎么办 华硕路由器忘记账号密码忘了怎么办 光纤猫光信号闪红灯不能上网怎么办 被传销洗了脑的人怎么办