题目:

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

示例:

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

提示:

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

方法一:另创建数组

 1 class Solution {
2 public int[] exchange(int[] nums) {
3 if (nums.length == 0 || nums == null) return new int[0];
4 int[] ans = new int[nums.length];
5 int n = 0, m = nums.length - 1;
6 while(n <= m){
7 for (int i = 0; i < nums.length; i++){
8 if (nums[i] % 2 == 0){
9 ans[m] = nums[i];
10 m--;
11 }else{
12 ans[n] = nums[i];
13 n++;
14 }
15 }
16 }
17 return ans;
18 }
19 }

方法二:双指针,利用位运算进行优化

 1 class Solution {
2 public int[] exchange(int[] nums) {
3 if (nums.length == 0) return new int[0];
4 int n = nums.length;
5 int i = 0, j = n - 1;
6 while(i <= j){
7 if ((nums[i] & 1) == 1){
8 i++;
9 }else if ((nums[j] & 1) == 0){
10 j--;
11 }else if ((nums[i] & 1) == 0 && (nums[j] & 1) == 1){
12 int temp = nums[i];
13 nums[i] = nums[j];
14 nums[j] = temp;
15 }
16 }
17 return nums;
18 }
19 }

或者

 1 class Solution {
2 public int[] exchange(int[] nums) {
3 if (nums.length == 0) return new int[0];
4 int n = nums.length;
5 int i = 0, j = n - 1;
6 while(i < j){
7 while (i < j && (nums[i] & 1) == 1) i++;
8 while (i < j && (nums[j] & 1) == 0) j--;
9 if ((nums[i] & 1) == 0 && (nums[j] & 1) == 1){
10 int temp = nums[i];
11 nums[i] = nums[j];
12 nums[j] = temp;
13 }
14 }
15 return nums;
16 }
17 }

注意:内部while循环也要判断一下的理由:当数组全部为奇数[1,3,5,7]或全部为偶数[2,4,6,8]时,当走到最边上的数后就会越界。

小知识:

判断奇偶性:用位运算代替 (% 2)

(nums[i]&1)==1 奇数判断,原理:奇数的最低位为1

(nums[i]&1)==0 偶数判断,原理:偶数的最低位为0

&运算规则: 0&0=0;0&1=0;1&0=0;1&1=1 即:两个同时为1,结果为1。

注意:位运算的优先级比较低,不要吝啬括号的使用。

剑指offer21(Java)-调整数组顺序使奇数位于偶数前面(简单)的更多相关文章

  1. 【剑指offer-21】调整数组顺序使奇数位于偶数前面,C++实现(冒泡排序)

    1.题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分. 2.思路 本题有两种解法,一种是不保证数组稳定性的解法,一种是保 ...

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

    剑指Offer:调整数组顺序使奇数位于偶数前面[21] 题目描述 输入一个整形数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 解题分析 使用插 ...

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

    题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 分析 事实上,这个题比较简单,很多种方式都可以实现,但是其时间复杂度或空间复 ...

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

    剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 Offer 21 这题的解法其实是考察快慢指针和头尾指针. package com.walegarrett.offer; /** * @Aut ...

  5. 【Java】 剑指offer(21) 调整数组顺序使奇数位于偶数前面

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇 ...

  6. 【剑指Offer】调整数组顺序使奇数位于偶数前面 解题报告(Python)

    [牛客网]调整数组顺序使奇数位于偶数前面 解题报告 标签(空格分隔): 牛客网 题目地址:https://www.nowcoder.com/questionTerminal/beb5aa231adc4 ...

  7. 剑指offer(07)-调整数组顺序使奇数位于偶数前面【转】

    来源:http://www.acmerblog.com/offer-6-2429/ 题目来自剑指offer系列 九度 1516 题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得 ...

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

    一.相对位置可以改变 1.题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分. 2.分析 不考虑相对位置,可以类比快排,用左右 ...

  9. Go语言实现:【剑指offer】调整数组顺序使奇数位于偶数前面

    该题目来源于牛客网<剑指offer>专题. 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和 ...

  10. 剑指OFFER之调整数组顺序使奇数位于偶数前面找(九度OJ1516)

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

随机推荐

  1. 音频编解码aac移植之ubuntu下aac的仿真的编译和运行

    一 编译 aac的编译其实很简单,配置好预编译选项之后,立即在根目录下执行:make 即可. 第一步:./configure 第二步: make 第三步: sudo make install 二 运行 ...

  2. 基于ads1292心电数据存储和状态显示

    一 前记 ads1292芯片在专业的心电采集这块应用十分广泛.随着医疗可穿戴的发展,便携式心电测量这块前景十分广阔.基于现在的几个项目,团队在这里花费了不少精力,借此机会把这个方向打造成团队的特色之一 ...

  3. B站Aimls的JavaFx教程目录合集

    B站里有时候不太好去找资源,用JS爬了下,整出标题和链接,方便后续查询某个知识点的使用! JavaFX视频教程第1课,hello world JavaFX视频教程第2课,application的启动方 ...

  4. Java递归实现全排列改进(一)---利用HashSet实现去重

    import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.Iter ...

  5. 实时3D渲染它是如何工作的?可以在哪些行业应用?

    随着新兴技术--3D渲染的发展,交互应用的质量有了极大的提高.用实时三维渲染软件创建的沉浸式数字体验,几乎与现实没有区别了.随着技术的逐步改进,在价格较低的个人工作站上渲染3D图像变得更加容易,设计师 ...

  6. 计算机网络-DNS以及FastGitHub

    前言 你是否观察到过这种现象,在访问Github时,有的时候能正常访问,有的时候再次刷新就访问不了,那么能不能有什么办法能一直访问.答案是有,就是在DNS层面能保证一直稳定获取可用并且快速的IP,这就 ...

  7. SnapHelper源码深度解析

    目录介绍 01.SnapHelper简单介绍 1.1 SnapHelper作用 1.2 SnapHelper类分析 1.3 LinearSnapHelper类分析 1.4 PagerSnapHelpe ...

  8. Button按钮Effect的用法

    教大家写一个好看的Button按钮 代码简单粗暴 <Grid > <Border Width="200" Height="30" Margin ...

  9. C# Mat Bitmap互转

    var mat = OpenCvSharp.Extensions.BitmapConverter.ToMat(source);//bitmap转mat Cv2.CvtColor(mat, mat, C ...

  10. AXI4的主机协议代码分析

    AXI4的主机协议代码分析 一.模块分析 (1)端口列表 input wire INIT_AXI_TXN, // Asserts when ERROR is detected output reg E ...