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

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

题目

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

最终的序列如下:

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;}

输出

val1:512val2: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类型对象

转载地址:http://kjpjm.baihongyu.com/

你可能感兴趣的文章
Yii2页面缓存详解
查看>>
ECMAScript正则表达式6个最新特性
查看>>
android Studio 快捷键
查看>>
MySQL Explain
查看>>
Java NIO
查看>>
1、图片水印 之 一
查看>>
分布式锁
查看>>
使用proxychains-ng代理转发终端命令
查看>>
mysql初始化错误
查看>>
shell中的函数,shell中的数组,告警系统需求分析
查看>>
df命令 、du命令 、磁盘分区
查看>>
Java并发编程:CountDownLatch、CyclicBarrier和 Semaphore
查看>>
使用JDK自带的jmap和jhat监控处于运行状态的Java进程
查看>>
App怎么免费接入聚合支付SDK?
查看>>
什么是TensorFlow?
查看>>
Web3与智能合约交互实战(附代码)
查看>>
选择日期:年月日时分秒 插件
查看>>
从零到有的突破:BCH爱好者聚集地BCH.Club公测上线
查看>>
自建容器映像登录也行?Quay整合多种进阶功能
查看>>
如何快速打造一款高清又极速的短视频APP?
查看>>