每天一道leetcode905-按奇偶排序数组

考试结束,班级平均分只拿到了年级第二,班主任于是问道:大家都知道世界第一高峰珠穆朗玛峰,有人知道世界第二高峰是什么吗?正当班主任要继续发话,只听到角落默默想起来一个声音:”乔戈里峰

前言

昨天贴的代码和题有错误,今天重发一下,抱歉哈~

2018.11.12号打卡明天的题目:

题目

每天一道leetcode905-按奇偶排序数组

题目详述

给定一个非负整数数组 A,返回一个由 A 的所有偶数元素组成的数组,后面跟 A 的所有奇数元素。

题目详解

使用额外空间的思路

  • 就是使用一个新的数组B,去存,每次判断原来的数组是不是偶数,是偶数就存到前面,是奇数就存到后面

代码

 1class Solution {
 2    public int[] sortArrayByParity(int[] A) {
 3        if(A.length == 0)
 4            return A;
 5        int [] B = new int [A.length];
 6        int begin = 0;
 7        int end = B.length - 1;
 8        for(int i=0;i<A.length;i++)
 9        {
10            if(A[i] % 2 == 0)
11            {
12                B[begin] = A[i];
13                begin++;
14            }
15            else{
16                B[end] = A[i];
17                end--;
18            } 
19        }
20        return B;
21    }
22}

代码讲解

  • 10-14行,是判断偶数,如果是偶数,那么就存到B的前面,同时注意begin++

  • 15-18行,是判断是奇数了,如果是奇数,那么就存到后面,同时end--;

不使用额外空间的思路

  • 直接在原数组进行操作,一个i从0数组开头开始,j从数组末尾开始;

  • 依次去判断,如果A[i]是偶数,直接i++,如果A[j]是奇数直接j--;(为啥呢,因为前面的数已经是偶数了,满足条件,就往后判断呗~后面的是奇数也是同理

  • 如果A[i]是奇数的同时A[j]是偶数,那么就交换这两个数

  • 由于这个是两端到中间遍历,速度肯定比上一个从头到尾快

代码

 1class Solution {
 2    public int[] sortArrayByParity(int[] A) {
 3        int i=0, j= A.length - 1;
 4        while(i < j)
 5        {
 6            if(A[i] % 2 == 1 && A[j] %2 == 0)
 7            {
 8                int temp = A[i];
 9                A[i] = A[j];
10                A[j] = temp;
11                i++;
12                j--;
13            }
14            else if(A[i] % 2 == 0)
15            {
16                i++;
17            }
18            else if(A[j] % 2 == 1)
19            {
20                j--;
21            }
22        }
23        return A;
24    }
25}

代码讲解

  • 6-13行 就是A[i]是奇数,A[j]是偶数,然后交换两者;

  • 14-17行 就是A[i]是偶数,往数组末端移动

  • 18-21行 就是A[j]是奇数,往数组开头移动

结束语

2018.11.12号打卡

作者乔戈里亲历2019秋招,哈工大计算机本硕,百度准入职java工程师,欢迎大家关注我的微信公众号:程序员乔戈里,公众号有3T编程资源,以及我和我朋友(准入职百度C++工程师)在秋招期间整理的近200M的面试必考的java与C++面经,并有每天一道leetcode打卡群与技术交流群,欢迎关注。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值