这个问题在这里详细描述-- 啊!。
输入输入由两行组成。第一行是乔恩·马吕斯那天能说的“啊”。第二句是医生想听的“啊”。输入中只使用小写字母‘a’和‘h’,每一行将包含0到999‘a’‘s,包括在内,后面跟着一个’h‘。输出输出“去”,如果乔恩马吕斯可以去那个医生,输出“否”,否则。样本输入1 aaah aaaaah样本Output1 无样本输入2 aaah样本输出2 go
我的这个问题的源代码如下。我编写了一个快速运行的实现,但不是最好的。为了提高代码的效率,我可以做什么修改?
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define MAX_LEN 1000
#define MAX_INP 2000
//Checks whether the input is in the required format
int isValidInput(char*);
int main(int __argc, char* __argv[]) {
char strJon[MAX_INP], strDoc[MAX_INP];
int resJon, resDoc;
gets(strJon);
gets(strDoc);
resJon = isValidInput(strJon);
if(resJon <= 0) {
printf("no\n");
return 0;
}
resDoc = isValidInput(strDoc);
if(resDoc <= 0) {
printf("no\n");
return 0;
}
if(resDoc > resJon) {
printf("no\n");
return 0;
}
printf("go\n");
return 0;
}
//Checks valid input & returns len
int isValidInput(char* strInp) {
char *str = strInp;
int len = 0;
if(str == NULL) return -1;
//Check if the string either starts with 'a' or 'h'
if(!(str[0] == 'h' || str[0] == 'H') && !(str[0] == 'a' || str[0] == 'A')) return -1;
len = strlen(str);
if((str[0] == 'h' || str[0] == 'H') && len > 1) return -1;
if(str[len - 1] != 'h' && str[len - 1] != 'H') return -1;
if(len > MAX_LEN) return -1;
while(*(str + 1) != NULL) {
if(*str != 'a' && *str != 'A') return -1;
++str;
}
str = NULL;
return len;
}发布于 2014-06-27 04:22:41
我没有看到任何关于实际评估输入的要求。这给出了一个简单的计算两个字符串长度的问题。如果您可以将字符串放入两个c-字符串中,并对calc执行指针算法,而不是昂贵的i++和i--,则有可能得到更快的行为。
#include<stdlib.h>
#include<stdio.h>
int main(int argc, char ** argv)
{
char c;
int i = 0;
while (getc(stdin) != '\n')
i++;
while (getc(stdin) != '\n')
i--;
if (i < 0)
printf("no\n");
else
printf("go\n");
return 0;
}发布于 2014-06-26 23:53:32
明显的性能增强是停止使用malloc,而使用堆栈。堆栈分配比堆分配快得多。将字符串声明更改为:
char strJon[MAX_INP], strDoc[MAX_INP];然后删除对malloc和free的调用。
通常,如果要分配固定数量而不返回当前作用域之外的结果,那么使用malloc在堆上分配是很愚蠢的。
尽管在如此琐碎的程序中,我无法想象它实际上有多重要,因为IO成本将超过这些增强。
发布于 2014-06-27 10:15:42
另一个可能的改进是认识到字符串必须包含重复的"aaaa“和"aaaaaaaa”,并同时处理4或8个字节(uint32_t或uint64_t)。32位或64位算术会快得多(除非你还在使用Z-80!)
只有当字符串与此模式不匹配时,才需要处理单个字节。
https://codereview.stackexchange.com/questions/55426
复制相似问题