【leetcode C语言实现】剑指 Offer 21.调整数组顺序使奇数位于偶数前面

题目描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。

示例:

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

提示:

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

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

解题思路

采用双指针法,一个从头到尾,一个从尾到头遍历,当遍历到的前面元素为偶数且遍历到的后面元素为奇数时,将两者互换。

代码

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

测试代码及结果

#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[])
{
    // 功能测试
    Test1(); // 奇数偶数交替出现
    Test2(); // 所有偶数都在奇数前面
    Test3(); // 所有奇数都在偶数前面
    Test4(); // 输入NULL指针
    Test5(); // 数组中只有一个元素

    return 0;
}

执行结果

猜你喜欢

转载自blog.csdn.net/sunshine_hanxx/article/details/107418457
今日推荐