位运算判断奇偶数_位运算判断奇偶数_title: LeetCode922奇偶数组排列——细想与逻辑...

2023-10-11 13:50

本文主要是介绍位运算判断奇偶数_位运算判断奇偶数_title: LeetCode922奇偶数组排列——细想与逻辑...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

3052e37511877faf89fda050a2e61410.png

title: LeetCode922奇偶数组排列——细想与逻辑 date: 2019-02-28 11:37:15 tags: LeetCode系列

LeetCode922:奇偶数组排列——细想与逻辑

LeetCode的922题目是:

给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。

对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。

你可以返回任何满足上述条件的数组作为答案。

示例: 输入: [4,2,5,7] 输出: [4,5,2,7] 解释: [4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。

先说说这个题的解法和三个思路,然后我再讲讲从这个题延伸的思路和做事的是的原则

基础版本:

class Solution:

def sortArrayByParityII(self, A: 'List[int]') -> 'List[int]':

even,odd=[],[]

result=[]

for n in A:

if n%2==0:#如果是偶数

even.append(n)

else:#如果是奇数

odd.append(n)

while odd and even:#交替排列

result.append(even.pop())

result.append(odd.pop())

return result

分析&解题:通过题目我可知,数组最终排列的是偶数和奇数交替排列,所以我们最开始想的就是,把一个混乱的数组以奇数和偶数的队列分开,然后我们把偶数列表和奇数列表里面的数交替放到最终返回结果的那个列表里面。 这样做比较直观,我们打题目做了分解,先区分再合并。

进阶I:

class Solution:

def sortArrayByParityII(self, A: 'List[int]') -> 'List[int]':

i,j=0,1

while i

if A[i]%2!=0:

while A[j]%2!=0:

j+=2

A[i],A[j]=A[j],A[i]#将i号位和j号位做了替换

i+=2

return A

分析&解题:在原有的队列中,一开始我们设置一号位和二号位(i=0,j=1),我们从一号位遍历这个数组,如果偶数位不是偶数,我就在奇数位去找偶数,然后找到奇数位的偶数,我将前面偶数位的奇数和奇数位的偶数调换(ps;这里的调换语句——>A[i],A[j]=A[j],A[i]). 这里我们i+=2和j+=2是因为,我i代表偶数位,j代表奇数位,所以我们+2是为了保证i都为偶数,j都为奇数。

进阶II:

class Solution:

def sortArrayByParityII(self, A: 'List[int]') -> 'List[int]':

i,j=0,1

list=[0]*len(A)

for n in A:

if n&1==0:

list[i]=n

i+=2

else:

list[j]=n

j+=2

return list

分析&解题:我们先创造一个长度为len(A)的队列list,里面的而数据以0填满。遍历原有队列A,里面如果是奇数,就让这个数进入list的奇数位,如果这个数为偶数,就让这个数进入list的偶数位。 里面判断奇偶数的方法是(n&1),符号&是一个位运算,如果是偶数: n&1==0,,如果是奇数:n&1!=0。

算法思路和做事原则

这个题目的思路其实比较简单,就是把奇数和偶数交叉排列,所以一开始的想打就是先分组,再合并。但是这有一个问题就是我们做了很多的重复性工作,算法的复杂度会很高。进阶的算法思路是: 减少分组和合并的步骤,直接盯着偶数位去看,如果偶数位不是偶数,那么我们就说明奇数位中一定有一个是是偶数,所以我把这两个交换一下,则改变原来的列表就好。第二个进阶的方法是,先创建一个新列表list,我们遍历原列表,如果是奇数我们就放在list的奇数位,如果是偶数,我们就放在list的偶数位,在这个算法中我们只创建了一个内存空间,遍历了一次列表,和基础算法比起来,简单了许多。 那么其实我们已经可以知道了,什么是好的算法,好的算法就是尽量少做事情。而我们做事的原则应该是,如果你是第一次在做这样的事情,你要先回基本的算法,它是你完成这样工作的基础(先得到60分),但是很耗时间和空间,因为他是复杂的算法,当你持续了解这个题目或者你做的事情,你的要想想如何才能少做事情,尽可能的降低时间和空间的使用,得到一个好算法(达到80——90分)。其中参考其他的方法,并且理解他的思路,这个很重要。 下一次我在聊聊大局和细节的关系。

这篇关于位运算判断奇偶数_位运算判断奇偶数_title: LeetCode922奇偶数组排列——细想与逻辑...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/188487

相关文章

MyBatis-Plus逻辑删除实现过程

《MyBatis-Plus逻辑删除实现过程》本文介绍了MyBatis-Plus如何实现逻辑删除功能,包括自动填充字段、配置与实现步骤、常见应用场景,并展示了如何使用remove方法进行逻辑删除,逻辑删... 目录1. 逻辑删除的必要性编程1.1 逻辑删除的定义1.2 逻辑删php除的优点1.3 适用场景2.

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

MySQL数据库读写分离与负载均衡的实现逻辑

《MySQL数据库读写分离与负载均衡的实现逻辑》读写分离与负载均衡是数据库优化的关键策略,读写分离的核心是将数据库的读操作与写操作分离,本文给大家介绍MySQL数据库读写分离与负载均衡的实现方式,感兴... 目录读写分离与负载均衡的核心概念与目的读写分离的必要性与实现逻辑读写分离的实现方式及优缺点读负载均衡

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

java中判断json key是否存在的几种方法

《java中判断jsonkey是否存在的几种方法》在使用Java处理JSON数据时,如何判断某一个key是否存在?本文就来介绍三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目http://www.chinasem.cn录第一种方法是使用 jsONObject 的 has 方法

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

mybatisplus的逻辑删除过程

《mybatisplus的逻辑删除过程》:本文主要介绍mybatisplus的逻辑删除过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录myBATisplus的逻辑删除1、在配置文件中添加逻辑删除的字段2、在实体类上加上@TableLogic3、业务层正常删除即

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于