【发布时间】:2015-11-23 16:23:59
【问题描述】:
该程序的目标是计算两个连续字母相同的实例数,并为每个测试用例打印该数字。输入最长可达 1,000,000 个字符(因此是保存输入的 char 数组的大小)。然而,有编码挑战的网站指出该程序在 2 秒运行时超时。我的问题是,如何优化该程序以更快地处理数据?问题是否源于大型 char 数组?
另外:对于 str[1000000] = "" 行,我收到编译器警告“赋值从指针生成整数而不进行强制转换”这是什么意思,应该如何处理?
输入: 测试用例数 大写字母 A 和 B 的字符串
输出: 每个测试用例中相邻的重复字母的数量,每个都在一个新行上。
代码:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
int main() {
int n, c, a, results[10] = {};
char str[1000000];
scanf("%d", &n);
for (c = 0; c < n; c++) {
str[1000000] = "";
scanf("%s", str);
for (a = 0; a < (strlen(str)-1); a++) {
if (str[a] == str[a+1]) { results[c] += 1; }
}
}
for (c = 0; c < n; c++) {
printf("%d\n", results[c]);
}
return 0;
}
【问题讨论】:
-
您需要以 nul 字符而不是字符串结尾:
str[1000000] = '\0';这是数组的第 10000001 个元素,因此您需要再声明 str 一个。至于效率,请尝试将 strlen 计算为一个变量并在循环绑定中使用它,以确保它不会每次都重新计算。 -
不要在
for循环条件中使用strlen,而是先计算它并存储在变量中,然后针对该变量进行测试。 -
你为什么要搞乱一个数组?如果您在阅读时跟踪骗子,那么您只需要知道前两个字符读取的是什么。
stdin自己做缓冲。 -
如果你只对两个连续的字母感兴趣,你只需要存储一个字母——你读到的最后一个。而且您不需要存储每个测试用例的结果,只需立即打印即可。
-
不要每次循环调用
strlen(str)。这使得你的循环O(n^2),因为strlen()每次都必须搜索空字符(尽管有些编译器足够聪明来优化它)。