zoukankan      html  css  js  c++  java
  • 1.5字符串-基本字符串压缩

    题目描述

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

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

    测试样例
    "aabcccccaaa"
    返回:"a2b1c5a3"
     
    "welcometonowcoder"
    返回:"welcometonowcoder"

    解决方法1:常规思路,用数组进行赋值,但是涉及到数字到字符的转化比较麻烦,还涉及到下标的变话,我的方法不完整,只统计了最多40个重复的压缩。
    #include <iostream>
    #include<string>
    using namespace std;
    string zipString(string);
    string zipString(string iniString) {
            int len = iniString.length();
            char outString[10000];
            int t = 0;
            int d = 0;
            for(int i = 0; i < len; i++) {
    			    outString[t] = iniString[i];
    				outString[++t] = 1 + 48;
    				if(iniString[i] != iniString[i+1]) {
    					t++;
    				}
    				
                    else {
                    	d = 1;   //标志是否可以压缩 
                    int j = i; 
                    int count = 0;
                    while(iniString[i] == iniString[j] && j < len) {
                        count++;
                        j++;
                    }
                    i = j-1;  //由于这里i循环会加1,所以这里赋值减1 
                    if(count < 10) {
                    	char out = count + 48;
    			     	outString[t] = out ; 
    			     	t++;
                    }
                    else if(count < 20) {
                    	char out1 = 1 + 48;
    					char out2 = count - 10 + 48; 
    					outString[t] = out1;
    					outString[t+1] = out2;
    					t = t + 2;
                    }
                    else if(count < 30) {
                    	char out1 = 2 + 48;
    					char out2 = count - 20 + 48;
    					outString[t] = out1;
    					outString[t+1] = out2;
    					t = t + 2;
                    }
                    else if(count < 40) {
                    	char out1 = 3 + 48;
    					char out2 = count - 30 + 48;
    					outString[t] = out1;
    					outString[t+1] = out2;
    					t = t + 2;
                    }
                    
                }
    			
    			
            }
            if(d) return outString;
    		else return iniString;
        }
    int main(int argc, char** argv) {
        string a = "jjjjjjxxxxxxxooZLFFFFF";
        cout << zipString(a);
        return 0;
         
    }
    

    解决方法2:a)直接用字符串解决,使用append函数进行添加字符串;b)stringstream进行整型数据到字符串的转换。完美解决上面出现的两个问题。程序思路,先统计个                   数,再进行字符串的链接,注意最后一个字符串的链接,已经跳出了循环。

    ng namespace std;
    
    string zipString(string);
    string intToString(int);
    
    string intToString(int v) {
    	stringstream t;
    	string temp;
    	t << v;
    	temp = t.str();
    	return temp;
    }
    string zipString(string iniString) {
            int len = iniString.length();
            string newStr;
            char newChar = iniString[0];
            int count = 1;
            int d = 0;
            for(int i = 1; i < len; i++) {
            	if(newChar == iniString[i]) {
            		count++;
    				d = 1;
    			}
    			else {
    			    
    				newStr += newChar;
    				newStr.append(intToString(count));
    				newChar = iniString[i];
    				count = 1;
    			}
    		}
    		newStr += newChar;
    		newStr.append(intToString(count));
    		if(d) return newStr;
    		else  return iniString;
        }
    
    int main(int argc, char** argv) {
        string a = "jjjjjjxxxxxxxooZLFFFFF";
        string b = "abcdefg";
        cout << zipString(a) << endl;
        cout << zipString(b) << endl;
        return 0;
         
    }
    

      

  • 相关阅读:
    SseEmitter broken pipe
    沉淀vue相关知识(主要还是个人积累用)
    简述箭头函数基本使用和this指向的问题
    前端渲染和后端渲染,前端路由和后端路由
    .net工程师学习vue的心路历程(三)
    .net工程师学习vue的心路历程(一)
    初始mongodb(一)
    .net工程师学习vue的心路历程(二)
    MySQL自我保护参数
    mongodb副本集添加节点
  • 原文地址:https://www.cnblogs.com/xiaohaigege/p/5175480.html
Copyright © 2011-2022 走看看