首页 > 试题广场 >

通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字

[问答题]
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
1、仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。
2、压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"。
要求实现函数: 
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);
【输入】 
pInputStr:  输入字符串
lInputLen:  输入字符串长度
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例 
输入:“cccddecc”   输出:“3c2de2c”
输入:“adef”     输出:“adef”
输入:“pppppppp” 输出:“8p”
#include <iostream>    
#include <cassert>    
    
using namespace std;    
    
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr)    
{    
    const char *p = pInputStr;    
    int num = 1;    
    int i = 0;    
    p++;    
    while(*p != NULL)    
    {    
        while(*p == *(p-1)&& *p != NULL)    
        {    
            num++;    
            p++;    
        }    
        if (num > 1)    
        {    
            int size = 0;    
            int temp = num;    
            while(num)             //计算位数    
            {    
                size++;    
                num /= 10;    
            }    
            num = 1;    
    
            for (int j = size; j > 0; j--)    
            {    
               pOutputStr[i+j-1] = '0'+ temp%10;    
               temp /= 10;    
            }    
            i +=size;    
            pOutputStr[i++] = *(p-1);    
            p++;    
        }else{    
            pOutputStr[i++] = *(p-1);    
            p++;    
        }    
    }    
    pOutputStr[i] = '\0';    
}    
    
int main()    
{    
    char input[] = "cccddecc";    
    char *output = new char[strlen(input) + 1];    
    stringZip(input,strlen(input),output);    
    cout<<output<<endl;    
    return 0;    
}    

发表于 2014-11-15 16:38:38 回复(0)
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr) {
  int len = 0;
  for (int i = 0, j = 1; i < lInputLen; i = j++) {
    while (pInputStr[i] == pInputStr[j]) ++j;
    if (j - i > 1) {
      sprintf(pOutputStr + len, "%d", j - i);
      len += strlen(pOutputStr + len);
    }
    pOutputStr[len++] = pInputStr[i];
  }
  pOutputStr[len] = '\0';
}

发表于 2016-11-03 17:34:11 回复(0)
public class Demo {

    public static void main(String[] args) {
        encode("aaabbcaa");
        encode("a");
        encode("abcabc");
        encode("ppppp");
        encode("");
    }

    public static void encode(String str) {
        if (str.equals("") || str == null) {
            System.out.println("");
            return;
        }

        StringBuffer sb = new StringBuffer();
        int count = 1;
        char element = str.charAt(0);

        for (int i = 1; i < str.length(); i++) {
            if (str.charAt(i) == element) {
                count++;
            } else {
                sb.append(element);
                sb.append(count == 1 ? "" : count);
                element = str.charAt(i);
                count = 1;
            }
        }

        sb.append(element);
        sb.append(count == 1 ? "" : count);

        System.out.println(sb.toString());
    }
}

发表于 2017-11-11 00:44:34 回复(0)
import copy
import sys

for string in sys.stdin:
    string2 = copy.deepcopy(string)
    length1 = len(string)
    i = 0
    letter_num = 1
    while i < len(string) - 1:
        if string[i] == string[i + 1]:
            letter_num += 1
            string = string[0:i] + string[i + 1:]
        else:
            string = string[0:i + 1] + str(letter_num) + string[i + 1:]
            letter_num = 1
            i += 2
    else:
        string = string[0:i + 1] + str(letter_num) + string[i + 1:]
    if len(string) > length1:
        print(string2)
    else:
        print(string)

发表于 2022-03-14 10:49:15 回复(0)
import itertools
l=[(k,len(list(g))) for k,g in itertools.groupby(input())]
a=''
for i in l:
    if i[1]!=1:
        a+=str(i[1]
    a+=str(i[0]
print(a)

发表于 2021-08-17 16:48:52 回复(0)
public class ZipString {

public static void main(String[] args) {
     String str = "cccdeeaaa";
     System.out.println(encode(str));
}

public static String encode(String str) {
      StringBuffer s = new StringBuffer(str);
      int startindex = 0;

      while  ( startindex < s.length() )  {
               int endindex = startindex;
               int count = 0;
               while (s.charAt(endindex) == s.charAt(startindex)) {
                   count++;
                   endindex++;
                   if(endindex >= s.length()) {
                         break;
                    }
      }

      if (count > 1)  {
               s.replace(startindex, endindex, count + "" + s.charAt(endindex - 1));
               startindex = endindex - (count - 2);
       }
      else { startindex = endindex;}
       }
       return s.toString();
}
}
编辑于 2020-04-11 22:43:19 回复(0)
output=''
p1=0
p2=p1
while p1<input.__len__():
   while p2+1<input.__len__() and input[p2]==input[p2+1]:
        p2+=1
    if p1==p2:
        output+=input[p1]
    else:
        output+='%d'%(p2-p1+1)
        output+=input[p1]
    p1=p2+1
    p2=p1
return output

发表于 2020-03-10 22:58:04 回复(0)
var str=readline();

var  container=[0];
for(let i=1;i<str.length;i++){
    if(str[i-1] != str[i]){
        container.push(i)
    }
}
var res=''
for(let i=0;i<container.length-1;i++){
    res+=(container[i+1]-container[i])+str[container[i]]

}
res+=(str.length  -container[container.length-1])+str[str.length-1]
console.log(res)

发表于 2020-02-29 10:11:08 回复(0)
void stringZip(const char *pInputStr, long lInputLen, char * pOutputStr)
{
    int l = 0, r = 1;
    int idx = 0;
    while (l < lInputLen)
    {
        if (pInputStr[l] != pInputStr[r])
        {
            int len = r - l;
            if (len == 1)
                pOutputStr[idx++] = pInputStr[l];
            else
            {
                pOutputStr[idx++] = len + '0';
                pOutputStr[idx++] = pInputStr[l];
            }
            l = r;
        }
        r++;
    }
    pOutputStr[idx] = '\0';
}
发表于 2019-07-31 15:59:54 回复(0)
 #include <iostream>
using namespace std;
void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr)
{
    int m=0,i=0;
    for(i=0;i<lInputLen;)
    {
        int num=1;
        for(int j=i+1;j<lInputLen+1;++j)
        {
            if(pInputStr[j]==pInputStr[i])
            {
                ++num;
            }
            else 
            {
                i=j;
                break;
            }
        }
        if(num>1)
        {
            pOutputStr[m++]=(char)num+'0';
            pOutputStr[m++]=pInputStr[i-1];
        }
        else if(num==1)
            pOutputStr[m++]=pInputStr[i-1];
    }
    pOutputStr[m]='\0';
}
int main()
{
    char input[]="aaabbbcddd";
    char *output=new char[strlen(input)+1];
    stringFilter(input, strlen(input), output);
    cout<<output<<endl;
    delete [] output;
    return 0;
}

发表于 2019-06-09 17:10:40 回复(0)
process.stdin.resume();
process.stdin.setEncoding('utf8');

let chunk = '';
let dataArr = [];
let result = [];//放置结果

function replaceStr(paramsStr){//替换重复字符串
  let str = paramsStr;
  let newStr = str.match(/(.)\1+/gi, '');//得到重复的字符串,并放进newStr里面
  newStr.map((item, index) => {//循环newStr,将str里面的替换掉
    return str = str.replace(item, item.length + item[0]);//replace不***作员字符串
  })
  return str;
}

process.stdin.on('data', function(data) {
if (typeof data === 'string') {
chunk += data;
data = data.slice(0, -2);
}
if (data == '') {
process.stdin.emit('end');
}
});

//end里面的逻辑
//先根据换行符\n将字符串chunk切开成数组,然后对每一行的字符串进行***作
process.stdin.on('end', function() {
dataArr = chunk.split('\n');
// dataArr = dataArr.slice(0, -2); //最后两个不一定是回车和空格,不能删掉!!!!!!!!!
let line = 0; //进程已经读取的行数
while (line < dataArr.length) {
let lineItem = dataArr[line++].trim();
if (lineItem == '') continue; //由此步骤得知,在控制台'\r'和''都等于''
result.push(lineItem.trim());
}
result.map((item, index) => {
console.log(replaceStr(item));
})
});
发表于 2018-09-28 16:50:19 回复(0)
q
发表于 2018-03-17 20:08:10 回复(0)
#include<iostream>
using namespace std;
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr)
{
    int i,j=0,s=1,tmp,count;
    for(i=0;i<lInputLen-1;i++)
    {
while(pInputStr[i]==pInputStr[i+1])//如果最后一个元素不与前面相等,最后一个元素无法输出,那么就要单独输出
{
i++;
s++;
}
if(s>1)
{
tmp=s;
count=1;
while(tmp/10)
{
count*=10;
tmp%=10;
}
while(count)
{
pOutputStr[j++]=s/count+'0';
s=s%10;
count/=10;
}

}
        pOutputStr[j++]=pInputStr[i];
        s=1;
    }
if(pInputStr[i]!=pInputStr[i-1])
pOutputStr[j++]=pInputStr[i];
pOutputStr[j]='\0';
}
int main()
{
    char *a="aabbbccd";
    char *b;
    b=new char[sizeof(a)];
    stringZip(a,strlen(a),b);
    cout<<b<<endl;
getchar();
    return 0;
}

发表于 2015-10-16 16:35:37 回复(1)
    public static String condense(String str) {
        char[] c = str.toCharArray();
        StringBuilder res = new StringBuilder();
        int count = 1;// 记录重复的次数
        char c1;
        int length = c.length;
        for (int i = 0; i < length; i++) {
            c1 = c[i];
            if (i < length - 1) {
                if (c[i + 1] == c[i]) {
                    count++;
                    if (i != length - 2) {
                        continue;
                    }
                }
                if (count > 1) {
                    res.append(count).append(c1);
                    count = 1;//上一次重复字母统计结束,计数器归为初始值
                } else {
                    res.append(c[i]);
                }
            } else {
                if (c[i] != c[i - 1]) {
                    res.append(c[i]);
                }
            }
        }
        return res.toString();
    }
发表于 2015-09-11 10:50:28 回复(0)
#include<iostream>
#include <string.h>
using namespace std;
void stringZip(const char *pInputStr,long lInputLen, char *pOutputStr)
{
	int i,j=0;
	int count=1;
	for(i=1;i<lInputLen+1;i++)
	{
		if(pInputStr[i]==pInputStr[i-1])
		{
			count++;
			continue;
     	}
     	if(count==1)
     	{
			pOutputStr[j]=pInputStr[i-1];
			j++;
		}
		else
		{
		  pOutputStr[j]=count+'0';
		  pOutputStr[j+1]=pInputStr[i-1];
		  j=j+2;
		  count=1;
		 } 
    }
	pOutputStr[j]='\0';
}
int main()
{
	char *s1;
	cin>>s1;
	int l=strlen(s1);
	char *s2=new char(l+1);
	stringZip(s1, l, s2);
	cout<<s2<<endl;
	return 0;
}
 


发表于 2015-09-01 11:47:08 回复(0)