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;
}

2021年6月27日 星期日

[122] Best Time to Buy and Sell Stock II

怎麼又寫起了Leetcode了呢~~~~~
久未寫, 寫起來果然是礙手礙腳的. 還因為蠢bug看半天= =
修了一下難得submit是過的!而且不算慢~
但對比最佳解還是有很長一段路要走, 哈!

int maxProfit(int* prices, int pricesSize)
{
    int profit = 0;
    int i = 0;
    int stockBuy=prices[0];
    if (pricesSize &lt;= 1)
        return profit;
    for (i=0; i &lt; pricesSize-1; i++)
    {
        if(prices[i+1] &lt; prices[i] )         
        {
            if(prices[i]-stockBuy &gt; 0)
                profit += prices[i] - stockBuy;
            stockBuy = prices[i+1];
        }
        else if ((i+1) == (pricesSize-1))
        {
            profit = profit + (prices[i+1] - stockBuy);               
            return profit;
        }
    }
    return profit;
}