2022年5月22日 星期日

[1545] Find Kth Bit in Nth Binary String

我覺得這題完美的詮釋了為何我不是天才是奴才T_T
完全想錯了方向!雖然覺得應該要可以呀?!(並不行~~~搖食指)
然後看了解答還覺得"蛤?!為什麼是這樣???"
最後發現submit by C 的人真的好少嗚嗚嗚

[2154] Keep Multiplying Found Values by Two

果然是easy 等級的題目?!但還是沒有辦法一次到位, 同志Q仍需努力XD


int findFinalValue(int* nums, int numsSize, int original){
    int stop = 0,i=0;
    while(!stop)
    {
        for (i=0; i<numsSize; i++)
        {
            if (nums[i]==original)
            {
                original=original*2;
                break;
            }        
        }
        if (i==numsSize)
            stop = 1;
    }
    return original;
}

有看到兩種厲害的寫法, 一是在迴圈裡面找到值之後index 就設回0 讓它continue , 感覺很beautiful !!! XD
另一個是先sorting 好, 接下來只要依次往後找, 並將original 每次乘二就好了, 新的值一定會在已sorting 好的array 後面!看到的人用了bubble sort感覺也很直覺!以上

2022年5月21日 星期六

[804] Unique Morse Code Words

覺得應該要會的題目><
malloc 和memset 的用法&放的位置一直喬不好!
刷題之路堪慮XD

2022年5月20日 星期五

[9] Palindrome Number

看一個數字是不是回文!且不要用轉成string 來做~~~~
一開始有點卡住, 因為商數不知道怎麼取出來?! 數字的長度無法預知
於是想說把最後一個數(除以十的餘數)取出來存到新的值,
新的值每次乘以十再加上取出來的餘數, 最後和原始的數字相比就可以知道是不是回文的數字版了!
看起來很完美但不意外的又卡到了MAX INT  XD
寫了一個很笨的判斷: 

bool isPalindrome(int x){
    if (x < 0)
        return false;
    int out=0, in = x;
    int head = 0;
    for(int i=0;i<10,x>0;i++)
    {
        if (i==9 && head >2 )
            return false;
//printf("%d,%d,%d,%d\n",i,head,out,x);
        out = out*10 + x%10;
        if (out == x%10)
            head = out;
        x/=10;        
    }
        
    return (out == in)? (true):(false);
}

然後發現討論區的都用 long 在偷吃步!可惡XD
long 可以完全省去判斷 MAX INT的麻煩, 但似乎是因為long 的關係需要較多的空間. 
以空間換取時間的概念~~~

bool isPalindrome(int x){
    if (x < 0)
        return false;
    long out=0;
    int in = x;
    while(x>0)
    {
        out = out*10 + x%10;
        x/=10;        
    }     
    return (out == in);
}



2022年5月15日 星期日

[190] Reverse Bits

說是不能拿1 往左邊shift 31 個位元!說會超過int ! 
但我明明就是unsigned int 啊到底在歡什麼><
總之一開始想的從最右邊開始一個一個往左邊檢查是不太實際的
一邊做一邊把input 依續往右shift ,這樣就可以一直 & 0x1 就好了!
不需要把0x1 一路往左邊移去and XD 
啊真是很久沒寫code 變的很笨啊
以下是貼別人的依樣畫葫蘆~
如果不喜歡31往下減就從1往上加其實也沒有不行!
但要記得最後要把剩下的不需要shift 的最後一個位數加上去
換言之其實for 回圈裡面就是只有做31次啦!
做到第32 次就會爆炸!這樣看起來我原本一開始的年久失修解法其實也沒有不行啊 XD 應該就看今天的input 值能不能被修改吧. 如果input 不能改, 那也只好去shift 1 囉!以上 & 以下XD
uint32_t reverseBits(uint32_t n) {
    unsigned int i,ret=0;
    for (i=31;i>0;i--)
    {
//printf("i %d, %d\n",i ,ret);
        ret = (ret + (n&1)) *2;
        n= n>>1;
    }
    ret = ret + (n&1);
    return ret;
}

2022年5月14日 星期六

[19] Remove Nth Node From End of List

 什麼?!不需要去在意它是倒數第幾個, 是這個意思嗎?!雖然覺得pointer 應該真的有懂, 但是好多小地方沒有考慮到喔QQ (會不會這就叫做沒有懂XD) 我好笨QQ

2022年5月8日 星期日

[7] Reverse Integer

奇怪itoa 怎麼不能用呢?(thinking圖)
檢查超出範圍的部分好麻煩喔~~~(滾來滾去)
亡盪惹我真的不會寫扣啊~~~(痛哭)

int reverse(int x){
    int pop ,revInt ;
    for (pop=0, revInt=0; x!= 0; )
    {
        pop = x%10;
        x/=10;
        if (revInt > INT_MAX/10  || (revInt == INT_MAX/10  && pop > 7))
           return 0;
        if (revInt < INT_MIN/10 || (revInt == INT_MIN/10  && pop < -8))
            return 0;
        revInt = revInt*10 + pop;
    }    
    return revInt;
}

2022年5月2日 星期一

[905] Sort Array By Parity

於是我怎麼又開始寫了呢XD 已經又瞬間忘光了pointer, 感覺可以算算去啊~(痛哭)
總之這題就是說input 一個array, 把偶數都擺前面, 奇數擺後面, 順序不限~
於是就簡單的橫出一個新array, 然後邊讀邊左邊丟右邊丟, 各用一個index 加加跟減減啊覺得世界美好!但我想它應該有一個可以用原本input 做出來的方法吧.....?! (thinking 圖) 
總之先來個簡單版



/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* sortArrayByParity(int* nums, int numsSize, int* returnSize){
    *returnSize = numsSize;
    if (numsSize <= 1)
        return nums;
    int i;
    int left = 0;
    int right = numsSize -1;
    int *retArray = (int *) malloc(sizeof(int) * numsSize);
    for (i=0;i<numsSize;i++)
    {
        if (nums[i]%2==0)
            retArray[left++]=nums[i];
        else
            retArray[right--]=nums[i];
    }
    return retArray;   
    
}

下面是因為忘記swap 怎麼寫了, 留存XD


/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
void swap(int *a, int *b)
{
    int tmp;
    tmp = *a;    
    *a = *b;
    *b = tmp;    
}

int* sortArrayByParity(int* nums, int numsSize, int* returnSize){
    *returnSize = numsSize;
    if (numsSize <= 1)
        return nums;
    int i, left, right;

    for (left=0,right = numsSize -1; left<right;left++, right--)
    {
        for(i=left; i< right; i++)
        {
            if (nums[i]%2==0)
                left++;
            else
                break;
        }
        for(i=right; left< right; i--)
        {
            if (nums[i]%2!=0)
                right--;
            else
                break;
        }
        swap(&nums[left],&nums[right]);        
    }
    return nums;   
    
}