1078 字符串压缩与解压

文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示。例如 ccccc 就用 5c 来表示。如果字符没有重复,就原样输出。例如 aba 压缩后仍然是 aba

解压方法就是反过来,把形如 5c 这样的表示恢复为 ccccc

本题需要你根据压缩或解压的要求,对给定字符串进行处理。这里我们简单地假设原始字符串是完全由英文字母和空格组成的非空字符串。

输入格式:

输入第一行给出一个字符,如果是 C 就表示下面的字符串需要被压缩;如果是 D 就表示下面的字符串需要被解压。第二行给出需要被压缩或解压的不超过 1000 个字符的字符串,以回车结尾。题目保证字符重复个数在整型范围内,且输出文件不超过 1MB。

输出格式:

根据要求压缩或解压字符串,并在一行中输出结果。

输入样例 1:

C
TTTTThhiiiis isssss a   tesssst CAaaa as

输出样例 1:

5T2h4is i5s a3 te4st CA3a as

输入样例 2:

D
5T2h4is i5s a3 te4st CA3a as10Z

输出样例 2:

TTTTThhiiiis isssss a   tesssst CAaaa asZZZZZZZZZZ

C:

/*#include<stdio.h>
#include<string.h>
void Contact(char *s)
{
    int len=strlen(s),i=0,j=0;
    char k;
    while(i<len)
    {
        k=s[i];
        j=i+1;
        while(j<len&&s[j]==k)
            j++;
        if(j-i>1)
            printf("%d",j-i);
        printf("%c",k);
        i=j;
    }
}
void Dtact(char *s)
{
    int len=strlen(s),i=0,k=0,j;
    while(i<len)
    {
        k=0;
        if(s[i]>='0'&&s[i]<='9')
        {
            k=s[i]-'0';
            i++;
            while(s[i]>='0'&&s[i]<='9')
            {
                k=10*k+s[i]-'0';
                i++;
            }
            for(j=0;j<k;j++)
                putchar(s[i]);
        }
        else
            putchar(s[i]);
        i++;
    }
}
int main()
{
    char c,s[1005];
    c=getchar();
    getchar();
    gets(s);
    switch(c)
    {
        case 'C':Contact(s);break;
        case 'D':Dtact(s);break;
        default:break;
    }
    return 0;
}*/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
void CCC(char *b)
{
	int l=strlen(b),i,j,k;
	for(i=0;i<l;i++)
	{
		j=i+1;
		while(b[i]==b[j]&&j<l)
		{
			j++;
		}
		if(j-i>1)
		{
			printf("%d%c",j-i,b[i]);
			i=j-1;
		}
		else
			printf("%c",b[i]);	
	}
}
void DDD(char *b)
{
	int l=strlen(b),i,j,k,a,flag;
	for(i=0;i<l;i++)
	{
		a=0,flag=0;
		while(isdigit(b[i])&&i<l)
		{
			a=a*10+(b[i]-'0');
			i++;
			flag=1;
		}
		if(flag==1)
			for(j=0;j<a;j++)
				printf("%c",b[i]);
		else
			printf("%c",b[i]);		
	}	
}
int main()
{
	char a,b[1001];
	scanf("%c\n",&a);
	gets(b);
	if(a=='C')
		CCC(b);
	else if(a=='D')
		DDD(b);	
	return 0;
}

C++:

#include <iostream>
#include <cstring>
using namespace std;

void CCC(char *b)
{
    int l = strlen(b), i, j, k;
    for (i = 0; i < l; i++)
    {
        j = i + 1;
        while (b[i] == b[j] && j < l)
        {
            j++;
        }
        if (j - i > 1)
        {
            cout << j - i << b[i];
            i = j - 1;
        }
        else
            cout << b[i];
    }
}

void DDD(char *b)
{
    int l = strlen(b), i, j, k, a, flag;
    for (i = 0; i < l; i++)
    {
        a = 0, flag = 0;
        while (isdigit(b[i]) && i < l)
        {
            a = a * 10 + (b[i] - '0');
            i++;
            flag = 1;
        }
        if (flag == 1)
            for (j = 0; j < a; j++)
                cout << b[i];
        else
            cout << b[i];
    }
}

int main()
{
    char a, b[1001];
    cin >> a;
    cin.ignore();
    cin.getline(b, sizeof(b));

    if (a == 'C')
        CCC(b);
    else if (a == 'D')
        DDD(b);

    return 0;
}

Java:

import java.util.Scanner;

public class Main {
    public static void CCC(char[] b) {
        int l = b.length;
        for (int i = 0; i < l; i++) {
            int j = i + 1;
            while (j < l && b[i] == b[j]) {
                j++;
            }
            if (j - i > 1) {
                System.out.print((j - i) + "" + b[i]);
                i = j - 1;
            } else {
                System.out.print(b[i]);
            }
        }
    }

    public static void DDD(char[] b) {
        int l = b.length;
        for (int i = 0; i < l; i++) {
            int a = 0;
            boolean flag = false;
            while (i < l && Character.isDigit(b[i])) {
                a = a * 10 + (b[i] - '0');
                i++;
                flag = true;
            }
            if (flag) {
                for (int j = 0; j < a; j++) {
                    System.out.print(b[i]);
                }
            } else {
                System.out.print(b[i]);
            }
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        char a = scanner.next().charAt(0);
        scanner.nextLine();
        String b = scanner.nextLine();

        if (a == 'C') {
            CCC(b.toCharArray());
        } else if (a == 'D') {
            DDD(b.toCharArray());
        }

        scanner.close();
    }
}

Python:

def CCC(b):
    l = len(b)
    i = 0
    while i < l:
        j = i + 1
        while j < l and b[i] == b[j]:
            j += 1
        if j - i > 1:
            print(str(j - i) + b[i], end='')
            i = j
        else:
            print(b[i], end='')
            i += 1

def DDD(b):
    l = len(b)
    i = 0
    while i < l:
        a = 0
        flag = False
        while i < l and b[i].isdigit():
            a = a * 10 + int(b[i])
            i += 1
            flag = True
        if flag:
            for _ in range(a):
                print(b[i], end='')
        else:
            print(b[i], end='')
        i += 1

a = input()
b = input()

if a == 'C':
    CCC(b)
elif a == 'D':
    DDD(b)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向阳而生__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值