华为机试—字符串压缩

题目:字符串压缩

通过键盘输入一串小写字母(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<stdio.h>
#include<iostream>
using namespace std;
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr){
    char pre=pInputStr[0];
    char current;//=pInputStr[0];
    int j=0;
    int count=1;
    for(long int i=1;i<lInputLen;++i)
    {
        current=pInputStr[i];
        if(current!=pre)
        {
            if(count!=1)
            {
                sprintf(pOutputStr+j,"%d%c",count,pre);
                while(count!=0)
                {
                    count/=10;
                    j++;
                }
                j++;
                count=1;
            }
            else
                pOutputStr[j++]=pre;
        }
        else
        {
            count++;
        }
        pre=current;
    }
    if(count!=1)
    {
        sprintf(pOutputStr+j,"%d%c",count,pre);
        while(count!=0)
        {
            count/=10;
            j++;
        }
        j++;
        count=1;
    }
    else
        pOutputStr[j++]=pre;

    pOutputStr[j]='\0';
}
int main(int argc, char *argv[])
{
    char input[100];
    char output[100];

    while(~scanf("%s",input)){
        stringZip(input,strlen(input), output);
        cout << output << endl;
    }
    return 0;
}

测试数据:

cccddecc

adef

pppppppp

结果:

时间: 2024-10-14 02:02:15

华为机试—字符串压缩的相关文章

华为机考--字符串压缩

通过键盘输入一串小写字母(a~z)组成的字符串.请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串. 压缩规则: 1. 仅压缩连续重复出现的字符.比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc". 2. 压缩字段的格式为"字符重复的次数+字符".例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz" 1 #include <iost

华为机试—字符串M化成以N为单位的段

按要求分解字符串,输入两个数M,N,M代表输入的M个待处理的字符串,N代表输出的每串字符串要处理成的位数,不够补0. 例如: 输入:2  8 abc  123456789 输出:abc00000 12345678,90000000 #include<iostream> #include<string> using namespace std; string s; string tmp; int main(int argc, char *argv[]) { int m,n; int

华为机试—字符串首字母转换成大写

举例: 输入:this is a book 返回:This Is A Book #include<stdio.h> #include<stdlib.h> #include<string.h> int main() { char input[]="this is a book"; char output[256]={'\0'}; int i,len; len=strlen(input); printf("变换前的字符串为:%s\n"

华为机试—字符串替代(aa-bc)

将输入的字符串(字符串仅包含小写字母'a'到'z'),按照如下规则,循环转换后输出:a->b,b->c,-,y->z,z->a:若输入的字符串连续出现两个字母相同时,后一个字母需要连续转换2次.例如:aa 转换为 bc,zz 转换为 ab:当连续相同字母超过两个时,第三个出现的字母按第一次出现算. 要求实现函数: void convert(char *input,char* output) [输入]  char *input , 输入的字符串 [输出]  char *output

华为机试—字符串去重排序

输入一个字符串,去掉重复出现的字符,并把剩余的字符串排序输出. #include<iostream> #include<string> using namespace std; int main(int argc, char *argv[]) { string s; while(cin>>s) { for(int i=0;i<s.size();++i) for(int j=i+1;j<s.size();++j) { if(s[i]>s[j]) { ch

华为机试—字符串过滤

题目:字符串过滤 通过键盘输入一串小写字母(a~z)组成的字符串.请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉. 比如字符串"abacacde"过滤结果为"abcde". 要求实现函数: void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr); [输入] pInputStr:  输入字符串 lInputLen:  输入字符串长度 [输出]

华为机试—字符串中找出单词排序

题目: 在给定字符串中找出单词( "单词"由大写字母和小写字母字符构成,其他非字母字符视为单词的间隔,如空格.问号.数字等等:另外单个字母不算单词):找到单词后,按照长度进行降序排序,(排序时如果长度相同,则按出现的顺序进行排列),然后输出到一个新的字符串中:如果某个单词重复出现多次,则只输出一次:如果整个输入的字符串中没有找到单词,请输出空串.输出的单词之间使用一个"空格"隔开,最后一个单词后不加空格. 要求实现函数: void my_word(charinput

(华为机试)双向链表实现字符串条件表达式的求值

描述: 给定一个以字符串形式表示的算术表达式,计算该表达式的值. 表达式支持如下运算:"+.-.*./",其中"*"和"/"的优先级要高于"+"和"-": 不需要考虑括号,且表达式之间没有空格: 例如:对于表达式"3-2+15*2",该表达式值为31. 运行时间限制: 60 Sec 内存限制: 256 MByte 输入: 加减乘除四则运算表达式,长度不超过1024字节,运算式中不含有括号

华为机试—介绍、剖析、建议

一.华为机试介绍 1.大致介绍 时间:120分钟 环境:Visual Studio(去年是vs2005).Visual C++.VC 6.0.Eclipse(Java) 题量:共3题 初级题--60分--3组测试数据 中级题--100分--5组测试数据 高级题--160分--8组测试数据 注:初级题和中级题为必答题,高级题为附加题. 提交次数:每题最多5次 评判方式:按通过测试数据组数给分,每通过一组得20分 2.考试说明 这里有一个老版的机试考试说明,供大家参考: C/C++,JAVA机试流程