字符串中字符的个数和字符序列

简介:

题目

输出上次字符串中字符的个数和字符

最终的序列如下:

1, 11, 21, 1211, 111221, ...

n=1时,输出字符串"1"

n=2时,输出上次字符串中字符的个数和字符,因为上次字符串有1个1,所以输出11

n=3时,由于上次字符是11,有2个1,所以输出21

n=4时,由于上次字符串是21,有1个2和1个1,所以输出1211

依次类推,写个countAndSay(n)函数返回字符串。

 

参考代码

复制代码
class Solution {
public:
    string getNextVal(const string &s)
    {
        stringstream rev;
        char pre = s[0];
        int preCount = 1;
        for (int i = 1; i <= s.size(); ++i)
        {
            if (s[i] == pre)
                ++preCount;
           else
           {
               rev << preCount << pre;
               preCount = 1;
               pre = s[i];
           }
        }
        return rev.str();
    }

    string countAndSay(int n) {
        if (n <= 0)
            return string();
        string say = "1";
        for (int i = 1; i < n; ++i)
        {
            say = getNextVal(say);
        }
        return say;
    }
};
复制代码

 

细嚼

1. 利用流,将整数、字符转化成字符串——stringstream提供转化或格式化

stringstream的一个常用的用法是:在多种数据类型之间实现自动格式化。

案例

复制代码
#include <iostream>
#include <sstream>
#include <ctime>
#include <string>
#include <vector>
using namespace std;


int main()
{
    ostringstream ostrm;
    int val1 = 512, val2 = 1024;
    ostrm << "val1: " << val1 << "\n" 
        << "val2: " << val2 << "\n"; 

    string str1, str2;
    int vals1, vals2;
    istringstream istrm(ostrm.str());
    istrm >> str1 >> vals1 >> str2 >> vals2;
    cout << str1 << endl;
    cout << vals1 << endl;
    cout << str2 << endl;
    cout << vals1 << endl;
}
复制代码

输出

1
2
3
4
val1:
512
val2:
512

2. 函数定义为

string getNextVal(const string &s)
  • 因为不改变s的值,故加上const修饰避免对s的修改
  • 因为string不是c++基本类型,故直接操作(利用引用&),可以避免较费力的复制
  • 返回类型不可以为const,因为返回值要赋值给非常量
  • 返回值不可以加引用,因为在函数体内的流为临时变量,函数结束,流也就夭折了

3. 空间复杂度为O(1),避免使用数组存放中间结果,例如

复制代码
    string countAndSay(int n) 
{ vector
<string> vec; if (n < 0) return ""; vec.push_back("1"); for (int i = 1; i < n; ++i) { string tmp = getNext(vec[i-1]); vec.push_back(tmp); } return vec[n-1]; }
复制代码

4. 利用字符串最后一个字符字节为'\0',下面函数体写在一起,使整体更连贯

复制代码
        for (int i = 1; i <= s.size(); ++i)
        {
            if (s[i] == pre)
                ++preCount;
           else
           {
               rev << preCount << pre;
               preCount = 1;
               pre = s[i];
           }
        }
复制代码

而不是写成如下

复制代码
        for (int i = 1; i < s.size(); ++i)
        {
            if (s[i] == pre)
                ++preCount;
           else
           {
               rev << preCount << pre;
               preCount = 1;
               pre = s[i];
           }
        }
     rev << preCount << pre;  //单独处理最后一个字符
复制代码

5. 流转化为字符串:str()函数——返回流中存储的string类型对象





本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/p/3778007.html,如需转载请自行联系原作者

相关文章
|
编解码 自然语言处理 数据挖掘
Recognize Anything:一个强大的图像标记模型
Recognize Anything是一种新的图像标记基础模型,与传统模型不同,它不依赖于手动注释进行训练
353 2
|
机器学习/深度学习 编解码 PyTorch
使用Pytorch实现频谱归一化生成对抗网络(SN-GAN)
自从扩散模型发布以来,GAN的关注度和论文是越来越少了,但是它们里面的一些思路还是值得我们了解和学习。所以本文我们来使用Pytorch 来实现SN-GAN
338 0
09JavaWeb基础 - Response类案例(下载文件)
09JavaWeb基础 - Response类案例(下载文件)
257 0
|
JavaScript IDE 前端开发
如何在大型代码仓库中删掉废弃的文件和 exports?
本文是我最近在公司内部写的废弃代码删除工具的一篇思考总结。
|
9月前
|
人工智能 搜索推荐 开发者
Aurora:xAI 为 Grok AI 推出新的图像生成模型,xAI Premium 用户可无限制访问
Aurora是xAI为Grok AI助手推出的新图像生成模型,专注于生成高逼真度的图像,特别是在人物和风景图像方面。该模型支持文本到图像的生成,并能处理包括公共人物和版权形象在内的多种图像生成请求。Aurora的可用性因用户等级而异,免费用户每天能生成三张图像,而Premium用户则可享受无限制访问。
195 11
Aurora:xAI 为 Grok AI 推出新的图像生成模型,xAI Premium 用户可无限制访问
|
10月前
|
Rust 安全 Java
探索Rust语言的并发编程模型
探索Rust语言的并发编程模型
263 2
|
10月前
|
存储 算法 程序员
C语言:库函数
C语言的库函数是预定义的函数,用于执行常见的编程任务,如输入输出、字符串处理、数学运算等。使用库函数可以简化编程工作,提高开发效率。C标准库提供了丰富的函数,满足各种需求。
|
安全 Unix Linux
Linux的优点和缺点
【8月更文挑战第8天】 Linux的优点和缺点
586 6
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
394 0
|
JavaScript
js扁平数据转树形结构数据
js扁平数据转树形结构数据
212 0