云上day-13

题目描述

给定一个完全由数字字符('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 个数字字符。

输出格式

输出该字符串对应的 p 型编码串。

解题思路

每遇到一个字符就需要判断是否与前一个字符相等,如果相等,那么计数继续加一;如果不相等,那么我们按照前一个字符个数加字符的形式加入到结果字符串中,但是当最后遍历结束时,需要将最后一个字符的个数以及字符本身加入到结果中。

解题代码

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);
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值