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

目录
相关文章
|
6月前
LeetCode 1550. 存在连续三个奇数的数组
LeetCode 1550. 存在连续三个奇数的数组
45 0
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
Leetcode题目"剑指 Offer 21. 调整数组顺序使奇数位于偶数前面"的两种Python解决方案,一种是使用双端队列调整数组顺序,另一种是使用双指针法将奇数移到数组前半部分,偶数移到后半部分。
28 4
|
6月前
LeetCode[题解] 2864. 最大二进制奇数
LeetCode[题解] 2864. 最大二进制奇数
34 0
|
6月前
leetcode-5942:找出 3 位偶数
leetcode-5942:找出 3 位偶数
71 0
|
6月前
剑指Offer LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面
剑指Offer LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面
44 0
|
算法
图解LeetCode——剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
图解LeetCode——剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
100 1
|
Python
Python|力扣周赛-统计位数为偶数的数字
Python|力扣周赛-统计位数为偶数的数字
90 0
|
算法 程序员
【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。
106 0
|
存储 算法
leetcode-每日一题1252. 奇数值单元格的数目(模拟优化)
时间复杂度:O(q * (m + n) + m * n) 其中q表示 indices 数组的长度,m、n为矩阵的行数和列数,遍历 indices 数组都要更新一次行列,总共需要O(q * (m + n))的时间,最后遍历一次矩阵,总共需要O(m * n)的时间
66 0
leetcode-每日一题1252. 奇数值单元格的数目(模拟优化)
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行