• 依序遍历当前字符串,若s[j] == s[j+1],将记录s[j]数量的sum++;若不等,则说明s[j]为一串相同数字的末尾,此时将s[j]的内容和其个数sum压入新串next
  • 注意遍历到串尾时,继续检查j+1会越界,由于每个s[j]的内容其实在上一次循环已经被检查过,且上一次循环记录的sum是此次循环对应值,可直接将串尾内容及sum压入next串
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cstdio>
#include<cctype>
#include<cmath>
#include<vector>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<sstream>
#define mm(a,x) memset(a,x,sizeof(a))
#define maxn 100005
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;

int main()
{
   
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	int a,k;
	cin>>a>>k;
	string s=to_string(a);
	--k;
	while(k--){
   
		string next;
		int sum=1;
		for(int i=0;i<s.length();i++){
   
			if(i==s.length()-1){
   
				next.append(s.substr(i,1));
				next.append(to_string(sum));
				break;
			}
			if(s[i]==s[i+1]) sum++;
			else{
   
				next.append(s.substr(i,1));
				next.append(to_string(sum));
				sum=1;
			}
		}
		s=next;
	}
	cout<<s<<"\n";
	
}



  • 遍历 s ,令 j 从当前位置 i 开始检查 s[j] 是否等于 s[i]
  • 当 j 检查到与 s[i] 不同或到串尾时会停在第一个不与 s[i] 相同的点 或是 串尾+1,那么 j-i 即为与 s[i] 相同的个数。
  • 将 s[i] 和个数 j-i 压入新串
  • 令 i=j,即从与上一个 s[i] 不同点处继续检查
#include<iostream>
using namespace std;
int main()
{
   
	string s;
        int n, j;
	cin >> s >> n;
	for (int k = 1; k < n; k++){
   
		string t;
		for (int i = 0; i < s.length(); i = j){
   
			for (j = i; j < s.length() && s[j] == s[i]; j++);
			t += s[i] + to_string(j - i);
		}
		s = t;
	}
	cout << s;
	return 0;
}