目录

题目:分离奇偶数

解法一:菜鸟级

解法二:头尾指针

解法三:快慢指针

再次优化解法三:

举一反三:解题:移动零

解法一:快慢指针

解法二:


题目:分离奇偶数

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

示例:

解法一:菜鸟级

遍历数组,如果为奇数,则从数组开头往进放,如果为偶数,则放入另一个数组中。

后续将偶数的数组再从原数组上次的结尾往后放

class Solution {public int[] exchange(int[] nums) {int left=0;int right=nums.length-1;int[] arr=new int[nums.length];int j=0;int k=0;for(int i=0;i<nums.length;i++) {if(nums[i]%2!=0) {nums[j]=nums[i];j++;} else {arr[k]=nums[i];k++;}}for(int i=0;i<k;i++) {nums[j]=arr[i];j++;}return nums;}
}

测试通过:

解法二:头尾指针

给左边和右边各标记上,左边判断是不是奇数,如果是奇数,则左边标记向前移一步,如果不是奇数,则停下来。再判断右边是否是偶数,同左边类似,停下后,左右交换数据,再进行新一轮的判断。

class Solution {public int[] exchange(int[] nums) {int left=0;int right=nums.length-1;while(left<right) {while(nums[left]%2!=0&&left<right) {//遇到偶数停下来left++;}while(nums[right]%2==0&&right>left) {right--;}int tmp=nums[left];nums[left]=nums[right];nums[right]=tmp;}return nums;}
}

提问:为什么里面又一次的判断保证left<right?

原因:

进入第一个循环时,是满足left<right,然后再进入循环,如果里面全是奇数,它是无法跳出第二个while的,一直加加,就会导致数组越界,所以我们要再次保证left<right

测试通过:

解法三:快慢指针

两个指针都从头开始,判断当前数据是否为奇数,如果为奇数,则快慢指针同时向前走一步,否则,快指针走,慢指针不动

class Solution {public int[] exchange(int[] nums) {int fast=0;//快指针int slow=0;//慢指针while(fast<nums.length) {if(nums[fast]%2==1) {//奇数int tmp=nums[fast];nums[fast]=nums[slow];nums[slow]=tmp;slow++;}fast++;}return nums;}
}

提问:为什么是奇数时,要交换?

原因:

看图理解:

测试通过:

再次优化解法三:

将模运算改成与运算

class Solution {public int[] exchange(int[] nums) {int fast=0;//快指针int slow=0;//慢指针while(fast<nums.length) {if((nums[fast]&1)==1) {//奇数int tmp=nums[fast];nums[fast]=nums[slow];nums[slow]=tmp;slow++;}fast++;}return nums;}
}

注意:与运算那里的括号

测试通过:

举一反三:解题:移动零

题目:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

要求及示例:

解法一:快慢指针

class Solution {public void moveZeroes(int[] nums) {if(nums==null) {return;}int fast=0;int slow=0;while(fast<nums.length) {if(nums[fast]!=0) {int tmp=nums[fast];nums[fast]=nums[slow];nums[slow]=tmp;slow++;}fast++;}}
}

提交通过:

解法二:

将不是0的数据往前挪动,并记录0的个数

结束后,将后面置0

class Solution {public void moveZeroes(int[] nums) {if(nums==null) {return;}int j=0;int count=0;for(int i=0;i<nums.length;i++) {if(nums[i]!=0) {nums[j++]=nums[i];} else {count++;}}for(int i=j;i<nums.length;i++) {nums[i]=0;}}
}

测试通过:

本期结束啦!!!

下期见!!!

LeetCode题集 —— 调整数组顺序使奇数位于偶数前面 + 移动零相关推荐

  1. 牛客题霸 [ 调整数组顺序使奇数位于偶数前面] C++题解/答案

    牛客题霸 [ 调整数组顺序使奇数位于偶数前面] C++题解/答案 题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保 ...

  2. 程序员面试题精选100题(29)-调整数组顺序使奇数位于偶数前面[算法]

    题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分.要求时间复杂度为O(n). 分析:如果不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每 ...

  3. 剑指offer_第13题_调整数组顺序使奇数位于偶数前面

    题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序 使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分 并保证奇数和奇数,偶数和偶数之间的相对位置不变. 理解 合并两个列表 ...

  4. java 取数组的前90位,LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面

    LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面 题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 示例: 输入 ...

  5. 《LeetCode力扣练习》剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 Java

    <LeetCode力扣练习>剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 Java 一.资源 题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组 ...

  6. 【LeetCode】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

    [LeetCode]剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 文章目录 [LeetCode]剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 一.双指针 一.双指针 解题思路: ...

  7. 【编程题目】调整数组顺序使奇数位于偶数前面

    54.调整数组顺序使奇数位于偶数前面(数组). 题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分, 所有偶数位于数组的后半部分.要求时间复杂度为 O(n). 小题,秒灭. ...

  8. 九度oj 题目1516:调整数组顺序使奇数位于偶数前面

    题目1516:调整数组顺序使奇数位于偶数前面 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:3416 解决:1091 题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序, ...

  9. 剑指offer:面试题21. 调整数组顺序使奇数位于偶数前面

    题目:调整数组顺序使奇数位于偶数前面 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 示例: 输入:nums = [1,2,3,4 ...

最新文章

  1. linux 内核按键抖动,Tiny4412 Linux驱动之按键(定时器防抖动) | 技术部落
  2. php 小炒花生,炒花生的做法_炒花生怎么做_炒花生的家常做法
  3. burpsuite 简单介绍
  4. 深度探讨验证码发展史,账户中心安全科普文
  5. js中对日期进行加减
  6. 中科院副研究员高林:面向可视媒体分析与合成的深度几何学习方法分享
  7. python怎么设置图片_python 调整图片亮度的示例
  8. 计算机程序设计语言有哪几类,计算机程序设计语言可以分为哪三类?
  9. PLSQL导出表结构和数据
  10. 一个杭州人的美国求医经历
  11. python dataframe的某一列变为list_手把手教你用Python爬中国电影票房数据
  12. 位、字符、字节、有什么区别
  13. 异形图片自动排版之装箱算法
  14. jib插件的简单使用
  15. Flutter中的Isolate的个人理解
  16. 单细胞甲基化测序(scBS-seq)比对率奇低?你的文库方向性参数可能没选对!
  17. Linux上启动mysql不成功
  18. IT服务管理(ITSM) 中的大数据
  19. Debian搭建dns服务器
  20. 树莓派上安装 ROS Kinetic

热门文章

  1. STM32中文手册解读(1)
  2. Python Pyside2 Pinger新手QQ音乐网易云酷狗爬虫下载
  3. Zabbix 5.0.12 异常:Zabbix unreachable poller processes more than 75% busy:
  4. double保留两位小数的方法
  5. 如何调节华硕主板的风扇速度?ROG STRIX B250I
  6. Tkinter 组件详解(七):Entry
  7. Ceph原理、部署、存储集群、块存储及对象存储centos7.5
  8. 踩雷1:Android Studio:3dmap 隐私合规校验失败: errorcode 555570 确保调用SDK任何接口前先调用更新隐私合规updatePrivacyShow、updateP
  9. Android分享视频链接到VK无法打开
  10. bat基础(转自堇色苹果)