位运算判断奇偶数_位运算判断奇偶数_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

相关文章

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言

Java逻辑运算符之&&、|| 与&、 |的区别及应用

《Java逻辑运算符之&&、||与&、|的区别及应用》:本文主要介绍Java逻辑运算符之&&、||与&、|的区别及应用的相关资料,分别是&&、||与&、|,并探讨了它们在不同应用场景中... 目录前言一、基本概念与运算符介绍二、短路与与非短路与:&& 与 & 的区别1. &&:短路与(AND)2. &:非短

Java中数组转换为列表的两种实现方式(超简单)

《Java中数组转换为列表的两种实现方式(超简单)》本文介绍了在Java中将数组转换为列表的两种常见方法使用Arrays.asList和Java8的StreamAPI,Arrays.asList方法简... 目录1. 使用Java Collections框架(Arrays.asList)1.1 示例代码1.

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效

C++实现回文串判断的两种高效方法

《C++实现回文串判断的两种高效方法》文章介绍了两种判断回文串的方法:解法一通过创建新字符串来处理,解法二在原字符串上直接筛选判断,两种方法都使用了双指针法,文中通过代码示例讲解的非常详细,需要的朋友... 目录一、问题描述示例二、解法一:将字母数字连接到新的 string思路代码实现代码解释复杂度分析三、

C++一个数组赋值给另一个数组方式

《C++一个数组赋值给另一个数组方式》文章介绍了三种在C++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方... 目录C++一个数组赋值给另一个数组循环遍历赋值使用标准库中的函数 std::copy 或 std::