博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字符串中字符的个数和字符序列
阅读量:6160 次
发布时间:2019-06-21

本文共 2705 字,大约阅读时间需要 9 分钟。

题目

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

最终的序列如下:

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 
#include
#include
#include
#include
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
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,如需转载请自行联系原作者

你可能感兴趣的文章
介绍自己的一个Android插桩热修复框架项目QuickPatch
查看>>
关于textarea的ie9的maxlength不起作用的问题,请参考如下URL解决。
查看>>
勒索病毒GANDCRAB新变种GANDCRAB V5.2新变种来袭 你中招了吗?
查看>>
Solr Facet 查询
查看>>
C++类的继承一
查看>>
数据库分库分表(sharding)系列(五) 一种支持自由规划无须数据迁移和修改路由代码的Sharding扩容方案...
查看>>
巧用VMware Workstation的clone来制作虚拟机模板
查看>>
Spring-Mybatis MapperScannerConfigurer 取不到PropertyPlaceholderConfigurer里的值
查看>>
HP DL380G4服务器前面板指示灯的含义
查看>>
数据结构_树结构
查看>>
常用URL地址
查看>>
每天一个linux命令(19):find 命令概览
查看>>
MySQL kill操作
查看>>
windows下看端口占用
查看>>
Decommissioning a Domain Controller 降域控
查看>>
Character中的奇葩
查看>>
c++书籍推荐
查看>>
互联网通用架构技术----缓存雪崩
查看>>
Dell R710服务器磁盘恢复数据库一例(记录)
查看>>
我的友情链接
查看>>