2018年2月14日 星期三

[283] Move Zeroes

給一個array
把零都向右堆
非零的向前排列
本來以為跟bubble sort 一樣
做完發現如果第一輪的第一個item還是0,
它就永遠做不到了XD
笨QQ
改採掃到第一個零之後, 就往後找第一個非零, 跟它換

Move Zeroes
swap版:
(奇怪別人怎麼都只要一到三行, 我的卻長這麼醜 囧)
void swap(int *a, int *b){
    int tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
   
}

void moveZeroes(int* nums, int numsSize) {
    int i, j ;
    int zerocount = 0;

    for (i=0; i<numsSize-1; i++)
    {
        if (nums[i]==0)
        {
            for(j=i+1;j<numsSize;j++)
                if(nums[j]!=0)
                {
                    swap(&nums[i],&nums[j]);
                    break;
                }
        }          
    }
}

抄別人的版本: 囧
void moveZeroes(int* nums, int numsSize) {
    int i, idx=0;
    for(int i = 0; i < numsSize; i++)
    {
        if(nums[i] != 0)
            nums[idx++] = nums[i];
    }
    for(int i = idx; i < numsSize; i++)
        nums[i] = 0;

}
原本怎麼想都不懂Orz 我是不是腦殘 Orz
用另一個index來記錄目前的非零值,
也就是說第一輪掃過去, 把非零的從頭開始填進去
反正最後面只要全部塞零就好
為什麼一開始我看不懂呢T_T
豪 ~~~~~~笨啊~~~~~~~~~~~~~~~(奔入暴雨中)

[20240714 更新]
哦!!!我竟然又感覺到自己的進步了!!!
(雖然一開始錯的地方一模模一樣樣 XD)
寫出了,以前的我,抄別人的那個版本,也就是說,我變成被抄的那個人了嗎姆襪哈哈哈哈哈哈!!!!!

void moveZeroes(int* nums, int numsSize) {
int l=0;
for (int i=0;i<numsSize; i++)
{
if (nums[i]!= 0)
nums[l++]= nums[i];
}
for (int j=l;j<numsSize;j++)
nums[j] = 0;
return;
}

[20251101 更新]
哦原本想要跳著寫~結果一場悲劇。先寫了個暴力法,結果跟hint 講的一樣,寫完暴力法就知道解答了~__~
void moveZeroes(int* nums, int numsSize) {
int idx = 0 ;
for (int i=0 ; i<numsSize; i++)
if (nums[i]!= 0)
nums[idx++]=nums[i];
while (idx <numsSize)
nums[idx++]=0;
}

[20251106] 沒想到又更了
看到室友寫了swap版本, 覺得不行我也要參透一下XD 所以
void swap (int *a, int *b)
{
int tmp = *a;
*a = *b;
*b=tmp;
}

void moveZeroes(int* nums, int numsSize) {
int l=0;
for (int r=0; r<numsSize; r++)
{
if (nums[r]!=0)
swap(&nums[l++], &nums[r]);
}
return;
}

沒有留言:

張貼留言