【leetcode C語(yǔ)言實(shí)現(xiàn)】劍指 Offer 21.調(diào)整數(shù)組順序使奇數(shù)位于偶數(shù)前面

題目描述

輸入一個(gè)整數(shù)數(shù)組,實(shí)現(xiàn)一個(gè)函數(shù)來(lái)調(diào)整該數(shù)組中數(shù)字的順序,使得所有奇數(shù)位于數(shù)組的前半部分,所有偶數(shù)位于數(shù)組的后半部分。

示例:

輸入:nums = [1,2,3,4]
輸出:[1,3,2,4]
注:[3,1,2,4] 也是正確的答案之一。

提示:

1 <= nums.length <= 50000
1 <= nums[i] <= 10000

來(lái)源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof

解題思路

采用雙指針?lè)?,一個(gè)從頭到尾,一個(gè)從尾到頭遍歷,當(dāng)遍歷到的前面元素為偶數(shù)且遍歷到的后面元素為奇數(shù)時(shí),將兩者互換。

代碼

bool IsEven(int number)
{
    return (!(number & 1));
}

int* exchange(int* nums, int numsSize, int* returnSize){
    int index1 = 0, index2 = numsSize - 1;
    while(index1 < index2)
    {
        while((index1 < index2) && (!IsEven(nums[index1])))
            index1++;
        while((index1 < index2) && (IsEven(nums[index2])))
            index2--;
        
        if(index1 < index2)
        {
            int temp = nums[index1];
            nums[index1] = nums[index2];
            nums[index2] = temp;
        }
    }

    *returnSize = numsSize;
    return nums;
}

測(cè)試代碼及結(jié)果

#include<stdio.h>
#include<stdbool.h>

int *exchange(int *nums, int numsSize, int *returnSize);
void PrintTest(int nums[], int length)
{
    for (int i = 0; i < length; i++)
    {
        printf("%d ", nums[i]);
    }
    printf("\n");
}

void Test1()
{
    int return_size;
    int nums[] = {1, 2, 3, 4, 5, 6, 7};
    PrintTest(exchange(nums, sizeof(nums) / sizeof(int), &return_size), sizeof(nums) / sizeof(int));
}

void Test2()
{
    int return_size;
    int nums[] = {2, 4, 6, 8, 1, 3, 5, 7};
    PrintTest(exchange(nums, sizeof(nums) / sizeof(int), &return_size), sizeof(nums) / sizeof(int));
}

void Test3()
{
    int return_size;
    int nums[] = {1, 3, 5, 7, 4, 6, 2, 8};
    PrintTest(exchange(nums, sizeof(nums) / sizeof(int), &return_size), sizeof(nums) / sizeof(int));
}

void Test4()
{
    int return_size;
    PrintTest(exchange((int *)NULL, 0, &return_size), 0);
}

void Test5()
{
    int return_size;
    int nums[] = {8};
    PrintTest(exchange(nums, sizeof(nums) / sizeof(int), &return_size), sizeof(nums) / sizeof(int));
}

int main(int argc, char* argv[])
{
    // 功能測(cè)試
    Test1(); // 奇數(shù)偶數(shù)交替出現(xiàn)
    Test2(); // 所有偶數(shù)都在奇數(shù)前面
    Test3(); // 所有奇數(shù)都在偶數(shù)前面
    Test4(); // 輸入NULL指針
    Test5(); // 數(shù)組中只有一個(gè)元素

    return 0;
}

執(zhí)行結(jié)果

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容