题目描述
给定一个完全由数字字符('0','1','2',…,'9')构成的字符串 str ,请写出 str 的 p 型编码串。例如:字符串 122344111
可被描述为 1个1、2个2、1个3、2个4、3个1
,因此我们说122344111
的 p 型编码串为 1122132431
;类似的道理,编码串 101
可以用来描述 1111111111
;00000000000
可描述为 11个0
,因此它的p型编码串即为 110
;100200300
可描述为 1个1、2个 0、1个2、2个0、1个3、2个0
,因此它的 p 型编码串为 112012201320
。
题目链接:B2123 字符串 p 型编码 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
输入格式
输入仅一行,包含字符串 str。每一行字符串最多包含 10001000 个数字字符。
输出格式
输出该字符串对应的 型编码串。
解题思路
每遇到一个字符就需要判断是否与前一个字符相等,如果相等,那么计数继续加一;如果不相等,那么我们按照前一个字符个数加字符的形式加入到结果字符串中,但是当最后遍历结束时,需要将最后一个字符的个数以及字符本身加入到结果中。
解题代码
C代码
#include<stdio.h>
#include<string.h>
int main(){
char str[1001];
scanf("%s",&str);
int len = strlen(str);
for(int i = 0; i < len; i++){
char c = str[i];
int num = 1;//起始个数为1
for(int j = i+1; j < len; j++)
{
if(str[j] != c)
{
i = j-1;
break; //若不再与c相同,则退出循环,重新定位i;
}
else
{
if(j != len-1)
{
num++;
}
else//该else语句判断是否在字符串结尾,避免重复
{
num++;
i = j;
break;
}
}
}
printf("%d%c",num,c);
}
return 0;
}
C++代码
#include<iostream>
using namespace std;
int main()
{
string str;
cin>>str;
str += ' '; //结尾添加一个字符,最后就不需要再对最后一个字符进行判断
int cnt = 1; //最短都是一个单独字符,长度为1
for(int i=1;i<str.size();i++){
if(str[i] == str[i-1]) cnt++; //只有字符连续,就计数加1
else {
cout<<cnt<<str[i-1]; //否则输出,并将计数设为1
cnt = 1;
}
}
return 0;
}
Java代码
//导包
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//输入数据
Scanner scanner = new Scanner(System.in);
String str = scanner.next();
//定义结果字符串
String result = "";
//操作
int sum = 1;
for (int i = 1; i < str.length(); i++){
//如果这个字符和前面一个相等,继续计数
if(str.charAt(i) == str.charAt(i - 1)){
sum++;
}else{//如果不相等,那么到前面那一个字符就停止计算,这个字符重新开始计数
result = result + sum + str.charAt(i - 1);
sum = 1;
}
}
result = result + sum + str.charAt(str.length() - 1);
//输出数据
System.out.println(result);
}
}