LeetCode题解—奇数位于偶数前面

简介: 又到周五啦,今天来个简单的算法题放松下。

前言


又到周五啦,今天来个简单的算法题放松下。


题目:调整数组顺序使奇数位于偶数前面


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


示例:


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


提示:


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


解法一


看到这个题,我首先想到的是遍历数组,如果遇到奇数就放到数组前面的位置,遍历结束工作也就完成了。其实这种解法也叫快慢指针,快指针为i,慢指针为j。


public int[] exchange(int[] nums) {
        int j = 0;
        for(int i = 0; i < nums.length; i ++){
            if(nums[i]%2!=0){
                int tmp = nums[i];
                nums[i] = nums[j];
                nums[j++] = tmp;
            }
        }
        return nums;
    }


其中,奇数的判断有两种判断方式:


  • a%2 != 0,这种更符合我们常规的计算方式,也就是对2取余数。
  • (a&1)==1,还有种方法是通过位运算,也就是判断二进制最后一位,是1就是奇数,这种方法性能会更好点。


时间复杂度


时间复杂度为O(n)


空间复杂度


因为每次用到tmp临时变量,所以空间复杂度为O(n)


解法二


还有一种解法,双指针法,就是一个从头开始遍历,一个从尾开始遍历,一直到两个相遇。


头指针找到偶数,尾指针找到奇数,就可以进行交换了。


public int[] exchange(int[] nums) {
        int i = 0, j = nums.length - 1, tmp;
        while(i < j) {
            //nums[i]为奇数,加1
            while(i < j && (nums[i] & 1) == 1) i++;
            //nums[j]为偶数,减1
            while(i < j && (nums[j] & 1) == 0) j--;
            tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
        }
        return nums;
    }


时间复杂度


时间复杂度为O(n)


空间复杂度


空间复杂度为O(1)


参考


https://leetcode-cn.com/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof

目录
相关文章
|
18天前
LeetCode 1550. 存在连续三个奇数的数组
LeetCode 1550. 存在连续三个奇数的数组
25 0
|
18天前
LeetCode[题解] 2864. 最大二进制奇数
LeetCode[题解] 2864. 最大二进制奇数
12 0
|
18天前
剑指Offer LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面
剑指Offer LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面
28 0
|
12月前
|
Python
Python|力扣周赛-统计位数为偶数的数字
Python|力扣周赛-统计位数为偶数的数字
70 0
|
12月前
|
算法 程序员
【LeetCode——编程能力入门第一天】基本数据类型[在区间范围内统计奇数数目/去掉最低工资和最高工资后的工资平均值)
给你两个非负整数 low 和 high 。请你返回 low 和 high 之间(包括二者)奇数的数目。 示例 1: 输入:low = 3, high = 7 输出:3 解释:3 到 7 之间奇数数字为 [3,5,7] 。 示例 2: 输入:low = 8, high = 10 输出:1 解释:8 到 10 之间奇数数字为 [9] 。 提示: 0 <= low <= high <= 10^9。
78 0
|
算法
图解LeetCode——剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
图解LeetCode——剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
80 1
|
存储 算法
leetcode-每日一题1252. 奇数值单元格的数目(模拟优化)
时间复杂度:O(q * (m + n) + m * n) 其中q表示 indices 数组的长度,m、n为矩阵的行数和列数,遍历 indices 数组都要更新一次行列,总共需要O(q * (m + n))的时间,最后遍历一次矩阵,总共需要O(m * n)的时间
52 0
leetcode-每日一题1252. 奇数值单元格的数目(模拟优化)
|
Java Python
【LeetCode每日一题】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面(持续更新)
【LeetCode每日一题】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面(持续更新)
60 0
|
前端开发 算法 JavaScript
LeetCode生成每种字符都是奇数个的字符串使用JavaScript解题|前端学算法
LeetCode生成每种字符都是奇数个的字符串使用JavaScript解题|前端学算法
74 0
LeetCode生成每种字符都是奇数个的字符串使用JavaScript解题|前端学算法
|
算法 PHP
力扣(LeetCode)算法题解:1295. 统计位数为偶数的数字
力扣(LeetCode)算法题解:1295. 统计位数为偶数的数字
90 0