2091088157xd @ 2022-02-13 20:57:56
这是我写的代码,结果都正确,但是都超时了,有什么好办法优化吗
#include<stdio.h>
int a[10000] = { 0 }, b[10000] = { 0 };
int main ()
{
char x='0',X = '0';
int k = 0, n, i, j = 1, z = 1, mark, sum = 0;
for (; 1;)//无限循环,后面有停止条件
{
scanf("%c", &x);
if (x != '\n')
{ sum++;//sum统计输入的数字字符数
x == X ? mark = 0 : mark = 1;
X = x;
//int(x - '0') == X ? mark = 0 : mark = 1;//如果发生了变化,则开关就会打开,对应的计数数组就会移动至下一位
//X = int(x - '0');//把字符转化为数字
if (X=='1')//开始判断数字,并分配
{
a[j]++;
if (mark==1)//如果开关打开,则对另一个数组进行移位到下一个空间
{
z++;
}
}
else
{
b[z]++;
if (mark==1)//如果开关打开,则对另一个数组进行移位到下一个空间
{
j++;
}
}
} else
{
if (k==0)//通过第一次出现回车来判断n的值,并进行单次记录
{
k = sum;
}
if (sum == k * k)//for循环的判断语句,当sum达到n的二次方时停止
{
break;
}
}
}
printf("%d ",k);//输出n
for (i = 1; i < j + z; i++)
{
if (i % 2 != 0)
{
printf("%d ", b[(i + 1) / 2]);//输出0的个数,因为0的个数一定排在i的奇数位,故用除二的方法来得出b得的数组位数
}
else
{
printf("%d ", a[i/2]);
}
}
return 0;
}
by 2091088157xd @ 2022-02-13 21:11:37
我自己又改了一下
#include<stdio.h>
int a[10000] = { 0 };
int main ()
{
char x='0',X = '0';
int k = 0, n, i, j = 1, mark, sum = 0;
for (; 1;)//无限循环,后面有停止条件
{
scanf("%c", &x);
if (x != '\n')
{
sum++;//sum统计输入的数字字符数
x == X ? mark = 0 : mark = 1;
X = x;
//int(x - '0') == X ? mark = 0 : mark = 1;//如果发生了变化,则开关就会打开,对应的计数数组就会移动至下一位
//X = int(x - '0');//把字符转化为数字
if (mark == 1)//如果开关打开,则对另一个数组进行移位到下一个空间
{
j++;
}
a[j]++;
}
else
{
if (k==0)//通过第一次出现回车来判断n的值,并进行单次记录
{
k = sum;
}
if (sum == k * k)//for循环的判断语句,当sum达到n的二次方时停止
{
break;
}
}
}
printf("%d ",k);//输出n
for (i = 1; i <= j ; i++)
{
printf("%d ", a[i]);
}
return 0;
}
by AAATM @ 2022-03-22 19:42:36
试试先把所有字符串加在一起