算法练习题22——解码

问题描述

小明有一串很长的英文字母,其中可能包含大写和小写字母。在这串字母中,有很多字母是连续且重复的。为了压缩这串字母的表达形式,小明决定将连续相同的字母用“字母 + 出现次数”的形式表示。

例如:

  • 连续的5个字母 a,即 aaaaa,可以简写成 a5
  • 同理,字符串 HHHellllloo 可以简写为 H3el5o2

但是为了方便表达,简写形式中连续相同的字母的次数不会超过9。

现在给出简写后的字符串,请帮助小明将其还原成原来的字符串。

输入格式:

  • 一行包含一个简写的字符串,字符串由大小写英文字母和数字组成,长度不超过 100。

输出格式:

  • 输出还原后的字符串。

约定:

  • 简写中的字母重复次数不会超过9。
  • 原始字符串的长度可能超过100。

代码

C++

#include<bits/stdc++.h> 
using namespace std;
int main(){
	char s[101];
	cin>>s;
	int length;
	length=strlen(s);
	for(int i=0;i<length;i++){
		if(s[i+1]>'1'&&s[i+1]<='9'){
			for(char j ='1';j<=s[i+1];j++){
				cout<<s[i];
			}
			i++;
		}
		else cout<<s[i];
	}
}

Java

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.next();  // 读取输入的字符串
        int length = s.length();  // 获取字符串的长度

        for (int i = 0; i < length; i++) {
            // 判断当前字符的下一个字符是否为 '1' 到 '9' 之间的数字
            if (i + 1 < length && s.charAt(i + 1) > '1' && s.charAt(i + 1) <= '9') {
                // 输出当前字符 s.charAt(i) 多少次,这个次数由下一个字符 s.charAt(i + 1) 决定
                for (char j = '1'; j <= s.charAt(i + 1); j++) {
                    System.out.print(s.charAt(i));
                }
                i++;  // 跳过下一个字符,因为它是数字,已经被处理过了
            } else {
                // 如果下一个字符不是数字,就直接输出当前字符
                System.out.print(s.charAt(i));
            }
        }
    }
}

健壮版Java

import java.util.Scanner;

public class DecodeString {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 输入简写后的字符串
        String input = scanner.nextLine();
        
        // 用于存储解码后的原始字符串
        StringBuilder decodedString = new StringBuilder();
        
        int length = input.length(); // 获取输入字符串的长度
        
        for (int i = 0; i < length; i++) {
            char currentChar = input.charAt(i); // 当前字符
            
            // 检查当前字符是否是字母
            if (Character.isLetter(currentChar)) {
                decodedString.append(currentChar); // 先输出当前字母
                
                // 检查下一个字符是否是数字
                if (i + 1 < length && Character.isDigit(input.charAt(i + 1))) {
                    int count = input.charAt(i + 1) - '0'; // 将数字字符转换为对应的整数
                    for (int j = 1; j < count; j++) {
                        decodedString.append(currentChar); // 输出当前字母 count-1 次
                    }
                    i++; // 跳过数字部分
                }
            }
        }
        
        // 输出解码后的字符串
        System.out.println(decodedString.toString());
        
        scanner.close(); // 关闭 Scanner
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值