首页
学习
活动
专区
圈层
工具
发布

去啊
EN

Code Review用户
提问于 2014-06-26 23:42:09
回答 3查看 338关注 0票数 5

这个问题在这里详细描述-- 啊!

输入输入由两行组成。第一行是乔恩·马吕斯那天能说的“啊”。第二句是医生想听的“啊”。输入中只使用小写字母‘a’和‘h’,每一行将包含0到999‘a’‘s,包括在内,后面跟着一个’h‘。输出输出“去”,如果乔恩马吕斯可以去那个医生,输出“否”,否则。样本输入1 aaah aaaaah样本Output1 无样本输入2 aaah样本输出2 go

我的这个问题的源代码如下。我编写了一个快速运行的实现,但不是最好的。为了提高代码的效率,我可以做什么修改?

代码语言:javascript
复制
#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;
}
EN

回答 3

Code Review用户

发布于 2014-06-27 04:22:41

我没有看到任何关于实际评估输入的要求。这给出了一个简单的计算两个字符串长度的问题。如果您可以将字符串放入两个c-字符串中,并对calc执行指针算法,而不是昂贵的i++和i--,则有可能得到更快的行为。

代码语言:javascript
复制
#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;
}
票数 6
EN

Code Review用户

发布于 2014-06-26 23:53:32

明显的性能增强是停止使用malloc,而使用堆栈。堆栈分配比堆分配快得多。将字符串声明更改为:

代码语言:javascript
复制
char strJon[MAX_INP], strDoc[MAX_INP];

然后删除对mallocfree的调用。

通常,如果要分配固定数量而不返回当前作用域之外的结果,那么使用malloc在堆上分配是很愚蠢的。

尽管在如此琐碎的程序中,我无法想象它实际上有多重要,因为IO成本将超过这些增强。

票数 4
EN

Code Review用户

发布于 2014-06-27 10:15:42

另一个可能的改进是认识到字符串必须包含重复的"aaaa“和"aaaaaaaa”,并同时处理4或8个字节(uint32_t或uint64_t)。32位或64位算术会快得多(除非你还在使用Z-80!)

只有当字符串与此模式不匹配时,才需要处理单个字节。

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/55426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档