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

题目

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

最终的序列如下:


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类型对象

字符串中字符的个数和字符序列,布布扣,bubuko.com

时间: 2024-10-13 11:41:48

字符串中字符的个数和字符序列的相关文章

删除字符串中出现次数最少的字符

题目描述 实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除.输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序. 输入描述: 字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节. 输出描述: 删除字符串中出现次数最少的字符后的字符串. 输入例子: abcdd 输出例子: dd 思路:(我的思路有点绕弯,先记录下来,后面有网友简洁思路),首先把字符串元素存入list中,继续以key-字符,value-出现次数存入map中,然后map按照val

[LeetCode] 在一堆字符串中找出包含相同字符的 group的较快方法,题 Anagrams

题目: Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be in lower-case. class Solution { public: vector<string> anagrams(vector<string> &strs) { } }; 题意本身并不是很清晰,开始我的代码总是报Output Limit Exceeded,

js常会问的问题:找出字符串中出现次数最多的字符。

一.循环obj let testStr = 'asdasddsfdsfadsfdghdadsdfdgdasd'; function getMax(str) { let obj = {}; for(let i in str) { if(obj[str[i]]) { obj[str[i]]++; }else{ obj[str[i]] = 1; } } let keys = Object.keys(obj); // 获取对象中所有key的值返回数组 let values = Object.values

[华为上机练习题]7.删除字符串中出现次数最少的字符

题目 描述: 实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除.输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序. 题目类别: 字符串 难度: 中级 运行时间限制: 10Sec 内存限制: 128MByte 阶段: 入职前练习 输入: 字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节. 输出: 删除字符串中出现次数最少的字符后的字符串. 样例输入: abcdd 样例输出: dd 代码 /*------------------------

华为机试:删除字符串中出现次数最少的字符

题目描述 实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除.输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序. 输入描述: 字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节. 输出描述: 删除字符串中出现次数最少的字符后的字符串. 示例1 输入 abcdd 输出 dd Java:用两个数组来记录各个字符的个数,一个用来排序找出最小的字符出现次数,一个用来决定是否输出当前字符. 1 import java.util.Arrays; 2 i

[算法]将字符串中的*前置,非*字符相对位置不变

如ab**cd*e12变成 ****abcde12 char* foo(char* str, int length){ int i = length-1,j = length-1; while(i >= 0 && j >= 0){ while(i >= 0 && '*' != str[i]){ --i; } j = i - 1; while(j >= 0 && '*' == str[j]){ --j; } if(j >= 0){

从第一个字符串中删除第二个字符串中出现过的所有字符

// 从第一个字符串中删除第二个字符串中出现过的所有字符 #include <stdio.h> char* remove_second_from_first( char *first, char *second ) { if( first == NULL || second == NULL ) { printf("first or/and second should not be NULL\n"); return NULL; } char flag[256]={0}; ch

找出字符串中出现次数最多的字符,和最大次数

/*找出字符串中出现次数最多的字符,和最大次数*/ function countMax(str){ var max = 0; // 记录出现的最大次数 var maxChar = ""; // 记录出现最多次数的字符 var counts = new Array(127); // 记录中间计算结果 for(var i = 0; i < counts.length; i++){ counts[i] = 0; } for(var i = 0; i < str.length; i

算法分析---删除字符串中出现次数最少的字符

编写一个函数,删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除.输出删除这些单词后的字符串.字符串中其他字符保持原来的顺序. 格式说明: 字符串仅仅包括字母.不可能为空串,不包括空格,单词仅仅由小写英文字母组成.输入的字符串长度不会超过20个char . 算法思路: (1)定义一个长度为26的整型数组 下标从0-25分别表示a-z这26个小写字母,用来保存字符串中各个字符出现的次数 (由于'a'-'a'=0,'z'-'a'=25刚好与数组的下标相应) "abcdddeeffffx