【刷题日记】905. 按奇偶排序数组
本次刷题日记的第 46 篇,力扣题为:905. 按奇偶排序数组 ,简单
一、题目描述:
加班的日子里刷一个简单题也显的那么不太和谐,但是还是要继续刷下去,哪怕是个简单题,也要记录一波,加牛
二、这道题考察了什么思想?你的思路是什么?
题目描述比较少,咱们也同样来看看题目都给我们说了哪些重要的信息:
- 题目中给出了一个数组,数组中的元素全部都是整数,有奇数,有偶数,位置是错乱的
- 题目要求我们将偶数移动到数组的前面位置,奇数移动到数组的后半段
稍微分析一下这个题,其实可以有很多种方式,很容易想到的方式其实就是,
- 开辟一个数组,和题目给出的的数组长度一致,遍历 1 次原数组,找出偶数全部 append 到 结果数组中,然后再遍历 1 次原数组,找出奇数全部 append 到 结果数组中
但是这种方式会遍历 2 次原数组,有点不聪明的鸭子
那么我们也可以想一下,如何减少循环?
- 我们同样开辟一个和原数组一样长度的数组,只用遍历一次原数组,将偶数加入到数组头,将奇数加入到数组尾巴就可以了
当然处理这种题的方式有很多,每一种方式都可以尝试一下,逐步优化,慢慢的对于不同的题目,思维就不会那么僵化,就能活学活用了
三、编码
根据上述逻辑和分析,我们就可以翻译成如下代码
编码如下:需要注意对于奇数和偶数的摆放位置,别弄反了,以及不要越界
func sortArrayByParity(nums []int) []int { n := len(nums) // 开辟一个和原数组同样空间的数组 ans := make([]int, n) left, right := 0, n-1 for _, num := range nums { // 如果是偶数,就放在数组的前面 if num%2 == 0 { ans[left] = num left++ } else { // 如果是基数就放在数组的后面 ans[right] = num right-- } } return ans }
根据编码的话就分两条路,遍历数组的时候,验证是奇数还是偶数,奇数走后面,偶数走前面,最终得到一个结果数组,直接返回即可
四、总结:
按照这种编码方式,时间复杂度就很明确了, 为 O(n) ,因为咱们的只遍历了一次数组
空间复杂度的话是看上去明明是开辟了一个 长度为 n 的数组,那么应该是 O(n) 才对,但是这个数组是作为结果返回的,因此不会计入空间复杂度,则此处的空间复杂度是 O(1)
原题地址:905. 按奇偶排序数组
今天就到这里,学习所得,若有偏差,还请斧正
欢迎点赞,关注,收藏
朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力
好了,本次就到这里
技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。
我是阿兵云原生,欢迎点赞关注收藏,下次见~