基本字符串压缩(程序员面试金典+string)字符串操作

基本字符串压缩
  • 参与人数:1661时间限制:3秒空间限制:32768K
  • 通过比例:15.52%
  • 最佳记录:0 ms|0K(来自  牛客游客)

题目描述

利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。

给定一个string iniString为待压缩的串(长度小于等于3000),保证串内字符均由大小写英文字母组成,返回一个string,为所求的压缩后或未变化的串。

测试样例
"aabcccccaaa"
返回:"a2b1c5a3"
"welcometonowcoderrrrr"
返回:"welcometonowcoderrrrr"
题目链接:http://www.nowcoder.com/practice/21f3a84300c94db092e0b5a7bf2d0ad1?rp=1&ru=/ta/cracking-the-coding-interview&qru=/ta/cracking-the-coding-interview/question-ranking


题意很简单但要理解透彻,我一开始就想错了,,,看测试数据有时候还是挺管用的;


这题主要是string的操作,主要是数字转字符串的操作,类似于java中的to_string()操作,我模拟了下。可能不是最优解。但复杂度是O(n) 应该可以接受


#include<stdio.h>
#include<string>
using namespace std;
class Zipper {
public:
    string zipString(string iniString) {
        // write code here
        string st="";
        if(iniString.size()==0) return st;
        st+=iniString[0];
        int cnt=1;
        for(int i=1;i<iniString.size();i++)
        {
            if(iniString[i]!=iniString[i-1])
            {
                st+=to_string(cnt)+iniString[i];
                cnt=0;
            }
            cnt++;
        }
        st+=to_string(cnt);
        if(st.size()>=iniString.size()) return iniString;
        else return st;

    }
    string to_string(int n)
    {
        int a[30],cnt=0;
        string s="";
        while(n)
        {
            a[cnt++]=n%10;
            n/=10;
        }
        for(int i=cnt-1;i>=0;i--)
        {
            s+=('0'+a[i]);
        }
        return s;
    }
};
int main()
{
    Zipper zi;
    string s="aabcccccaaa";
    s=zi.zipString(s);
    for(int i=0;i<s.size();i++) printf("%c",s[i]);
    puts("");
    string ss="welcometonowcoderrrrr";
    ss=zi.zipString(ss);
    for(int i=0;i<ss.size();i++) printf("%c",ss[i]);
    puts("");
    return 0;
}

你可能感兴趣的:(String,字符串,程序员面试金典)