问题描述
小明有一串很长的英文字母,其中可能包含大写和小写字母。在这串字母中,有很多字母是连续且重复的。为了压缩这串字母的表达形式,小明决定将连续相同的字母用“字母 + 出现次数”的形式表示。
例如:
- 连续的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
}
}