2021年7月4日 星期日

[38] Count and Say

我覺得我一定誤會了什麼
雖說recursive據說都可以用非recursive的方式寫出來
但我現在好困惑我好迷惘
我是誰我在哪裡我在這裡做什麼~(寫Leetcode)
每次執行出來的速度和memory需求都不一樣~為什麼會這樣呢?
難道測資會變嗎XD
總而言之~還有就是buffer的free應該在哪兒呀?!
真是太久沒寫C了一切變得好難!
兩個buffer應該可以融為一體(吧)然後好像字串的copy比較慢(我猜的)
想一想再來重寫一次好了......(然後就忘記了吧哈哈哈笑著流淚)
char * countAndSay(int n)
{
    if (n<=1)
    {
        return "1";
    }
    
    char *buffer = countAndSay(n-1);
    int bufferLen= strlen(buffer);
    char *output = (char *) malloc(sizeof(char) * (2*bufferLen+1));
    sprintf(output, "%s",buffer);
    output[bufferLen] = 0;
    char count[16];
    char cat[2*bufferLen+1];
    cat[0]= 0;
    int say =0;
    int pre = 0, reset = 0;
    for (say=0; say < bufferLen; say++)
    {
        reset++;
        if (output[say]== output[say+1])
            continue;            
        else
        {
            sprintf(count,"%d%c",reset,output[pre]);
            strcat(cat, count);
            pre=say+1;
            reset=0;
        }
    }
    sprintf(output,"%s",cat);
//    free(output);
    return output;
}
改成memcpy也沒有快多少啊哈哈哈(逃走)
char * countAndSay(int n)
{
    if (n<=1)
    {
        return "1";
    }
    
    char *buffer = countAndSay(n-1);
    int bufferLen= strlen(buffer);
    char *output = (char *) malloc(sizeof(char) * (2*bufferLen+1));
    memset(output, 0, 2*bufferLen+1);
    memcpy(output, buffer, bufferLen);
    char count[16];
    char cat[2*bufferLen+1];
    cat[0]= 0;
    int say =0;
    int pre = 0, reset = 0;
    for (say=0; say < bufferLen; say++)
    {
        reset++;
        if (output[say]== output[say+1])
            continue;            
        else
        {
            sprintf(count,"%d%c",reset,output[pre]);
            strcat(cat, count);
            pre=say+1;
            reset=0;
        }
    }
    memcpy(output, cat, strlen(cat));
//    free(output);
    return output;
}