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

相关文章

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

poj 3259 uva 558 Wormholes(bellman最短路负权回路判断)

poj 3259: 题意:John的农场里n块地,m条路连接两块地,w个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts。 任务是求你会不会在从某块地出发后又回来,看到了离开之前的自己。 判断树中是否存在负权回路就ok了。 bellman代码: #include<stdio.h>const int MaxN = 501;//农场数const int

uva 575 Skew Binary(位运算)

求第一个以(2^(k+1)-1)为进制的数。 数据不大,可以直接搞。 代码: #include <stdio.h>#include <string.h>const int maxn = 100 + 5;int main(){char num[maxn];while (scanf("%s", num) == 1){if (num[0] == '0')break;int len =

hdu 1166 敌兵布阵(树状数组 or 线段树)

题意是求一个线段的和,在线段上可以进行加减的修改。 树状数组的模板题。 代码: #include <stdio.h>#include <string.h>const int maxn = 50000 + 1;int c[maxn];int n;int lowbit(int x){return x & -x;}void add(int x, int num){while

zoj 1721 判断2条线段(完全)相交

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。 2点可达条件:没有线段与这2点所构成的线段(完全)相交。 const double eps = 1e-8 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

hdu1010 奇偶剪枝

恰好t时间到达 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.Arrays;import

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,