列表

详情


NC101. 压缩字符串(一)

描述

利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2bc5a3。
1.如果只有一个字符,1不用写
2.字符串中只包含大小写英文字母(a至z)。

数据范围:
0<=字符串长度<=50000

要求:时间复杂度O(N)

示例1

输入:

"aabcccccaaa"

输出:

"a2bc5a3"

示例2

输入:

"shopeew"

输出:

"shope2w"

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 4ms, 内存消耗: 520KB, 提交时间: 2022-04-28

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param param string字符串 
 * @return string字符串
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
char* compressString(char* param ) {
    // write code here
    if (param == NULL) return NULL;
    
    int i,j,k;
    int len = strlen(param);
    i = 0;
    k = 0;
    while (i < len) {
        for (j = i; j < len; j++) {
            if (param[j] != param[i]) break;
        }
        
        int size = j - i;
        param[k++] = param[i];
        if (size > 1 && size < 10) {
            param[k++] = size + '0';
        } else if (size >= 10) {
            int tmp = k + (int)log10(size);
            int limit = k;
            k = tmp + 1;
            while (tmp >= limit) {
                param[tmp--] = size % 10 + '0';
                size /= 10;
            }
        } 
        i = j;
    }
    
    param[k] = '\0';
    return param;
}

C 解法, 执行用时: 4ms, 内存消耗: 536KB, 提交时间: 2022-07-23

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param param string字符串 
 * @return string字符串
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
int int2str(int n,char* res){
    char temp[6],i=6;
    while(n){
        temp[--i] = n%10 +0x30;
        n /= 10;
    }
    memcpy(res,temp+i,6-i);
    return 6-i;
}
char* compressString(char* param ) {
    // write code here
    int cnt=1;
    int len = strlen(param);
    if(len == 0) return param;
    char* res = (char*)malloc(len+1);
    memset(res,0,len+1);
    int p=0;
    for(int i=1;i<len;i++){
        if(param[i] == param[i-1]){
            cnt++;
        }
        else{
            res[p++] = param[i-1];
            if(cnt>1){
                p += int2str(cnt, res+p); 
            }
            cnt=1;
        }
    }
    res[p++] = param[len-1];
    if(cnt>1){
        p += int2str(cnt, res+p);
    }
    return res;
}

C 解法, 执行用时: 4ms, 内存消耗: 652KB, 提交时间: 2022-01-10

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param param string字符串 
 * @return string字符串
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
char* compressString(char* param ) {
    int len=strlen(param);
	static char res_char[5001000]="\0";
	int index=0,j=1;
	res_char[0]=param[0];
	int count=1; 
    for(int i=0;i<len;i++){
    	if(param[i]==param[i+1]&&param[i+1]!='\0'){
			count++;
		}
		else{
			if(count!=1&&count<10){
				res_char[j++]=count+'0';
			}
			if(count>=10){
				char str[10]={0},k=0;
				while(count>=10){
					str[k++]=count%10+'0';
					count=count/10;
				}
				str[k]=count+'0';
				for(int p=k;p>=0;p--){
					res_char[j++]=str[p];
				}
			}
			res_char[j++]=param[i+1];
			count=1;
		}
	}
	return res_char;
}

C++ 解法, 执行用时: 4ms, 内存消耗: 676KB, 提交时间: 2021-09-12

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param param string字符串 
     * @return string字符串
     */
    string compressString(string param) {
        // write code here
        int l=0,r=0;
        int sum=1;
        char tar,now;
        tar=param[l];
        string ans;
        while(r<param.size()){
            now=param[++r];
            if(now==tar) ++sum;
            else{
                ans+=tar;
                if(sum>1) ans+=to_string(sum);
                tar=now;
                sum=1;
            }
        }
        return ans;
        
    }
};

C++ 解法, 执行用时: 4ms, 内存消耗: 688KB, 提交时间: 2022-07-24

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param param string字符串 
     * @return string字符串
     */
    string compressString(string param) {
        // write code here
        int index = 0;
        string result;
        int n = param.size();
        while(index < n){
            int i = index;
            while(i < n && param[i] == param[index]){
                i++;
            }
            int number = i - index;
            if(number == 1){
                result += param[index];
            }
            else{
                result += (param[index] + to_string(number));
            }
            index = i;
        }
        return result;
    }
};

上一题