题目描述
给定一个字符串str,返回str的统计字符串。例如“aaabbbbcccd”的统计字符串为“a_3_b_4_c_3_d_1”。
输入
输入一行字符串(1<=长度<=10^5)。
输出
输出一行字符串,代表统计字符串。
样例输入
offerofferzainaliiiiii
hhhaaa
样例输出
o_1_f_2_e_1_r_1_o_1_f_2_e_1_r_1_z_1_a_1_i_1_n_1_a_1_l_1_i_6
h_3_a_3
提示
时间复杂度O(n),空间复杂度O(n)。
对于我个人来说我很喜欢看这位大佬的代码,非常喜欢他的代码风格,下面附上大佬的博客
超级大佬的博客
ps:要定义一个指向当前字符的数组,和一个记录当前字符的变量,而且在遍历字符数组的时候,需要不断更新当前指向的字符以及字符的数量且要在更新之前要把对应的字符以及字符的数量输出来。
首先放上大佬的代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
char c[maxn];
int main()
{
while (~scanf("%s", c + 1))
{
int now = c[1], num = 0;
int lc = strlen(c + 1);
for (int i = 1; i <= lc; ++i)
{
if (now == c[i])
++num;
else
{
printf("%c_%d_", now, num);
num = 1;
now = c[i];
}
}
printf("%c_%d\n", now, num);
}
return 0;
}
刚刚拿到题目的我,一时堵塞做了蛮久都没做出来,下面附上我写的代码仅供参考,个人还是很喜欢大佬写的代码——简洁明了大方
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e5 + 5;
const int inf = 0x3f3f3f3f;
int a[maxn];
char c[maxn];
int main()
{
while (~scanf("%s", c))
{
int ans = 1;
int lc = strlen(c);
for (int i = 0; i < lc; ++i)
{
if (c[i] == c[i + 1])
++ans;
else
{
if (i != lc - 1)
printf("%c_%d_", c[i], ans);
else
printf("%c_%d\n", c[i], ans);
ans = 1;
}
}
}
return 0;
}
最后附上另一种做法
大佬的博客欢迎阅读
这是另外一个全能大佬写的,故事的开始是这样的,这个大佬看到我在电脑面前苦思冥想都没搞出来,就嘲笑了我一波,当时心高气傲的我不服大佬的嘲笑,并且认为这个题目还比较难愚蠢的行为,当时和大佬打赌,赌约——请吃饭,如果大佬能在五分钟之内写出来那么我就请他吃饭,否则他就请我吃饭,,,,,,不过最后大佬卡在判断哪里卡了几分钟,虽然最后用了七分钟做出来,,,,但是但是但是,赖皮成性的那位大佬…
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e5 + 5;
const int inf = 0x3f3f3f3f;
int a[maxn];
char c[maxn];
int main()
{
while (~scanf("%s", c))
{
int cnt = 0;
int lc = strlen(c);
int ccc = 1;
bool ch = false;
for (int i = 0; i < lc; ++i)
{
if (c[i + 1] == c[i])
ccc++;
else
{
if (ch)
cout << "_";
cout << c[i] << "_" << ccc;
ccc = 1;
ch = true;
}
}
cout << endl;
}
return 0;
}
有些心结,有些人,有些向往,放在心里也许会守护的更久一点~ |
---|