剑指offer.调整数组顺序使奇数位于偶数前面

题目:

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

思路:

1.不考虑多的情况下最简单的思路就是从头扫描这个数组,每碰到一个偶数,拿出这个数字,并把位于这个数字后面所有的数字往前挪动一位,然后再把这个数字放到最后面的那个空格里。但这个时间复杂度高达n^2,所以我们要尝试更高效的算法

2.想一想,在之前的基础上我们实际上就是用一个指针遍历这个数组,按照题目所需来移动数字,想要提高效率,其实只需要对这个方法进行改良就好了。我们设置一个指针还是指向第一个元素,再设置一个指针指向最后一个元素。如果前面的指针指的是奇数就把指针往后挪一位同样的道理,如果后面的指针指的是偶数的话就往前挪一位,直到前面的指针指的是偶数,然后后面的指针指的是奇数,就把两数交换。

3.这个题实际上如果改变要求条件的话,就是考验程序员对于扩展性的理解,能不能整理出一个框架的能力就体现在这里;其实不管改数组调整的什么条件其实都只要修改函数里的两个判断的标准,这个函数就其实就被解耦成两部分。一部分是判断数字应该在数组前半部分还是 后半部分的标准;二是拆分数组的操作。

代码实现:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* exchange(int* nums, int numsSize, int* returnSize) {
    int left = 0, right = numsSize - 1;
    *returnSize = numsSize;
    while (left < right) {
        while (left < numsSize &&  nums[left] % 2 == 1) {
            left++;
        }
        while (right >=0 && nums[right] % 2 == 0) {
            right--;
        }
        if (left >= right) {
            break;
        }
        int tmp = nums[left];
        nums[left] = nums[right];
        nums[right] = tmp;
        left++;
        right--;
    }
    return nums;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值