选择排序、冒泡排序、异或运算(下)

简介: 选择排序、冒泡排序、异或运算(下)

image.png

第二次排序确定了位置4上的数据是5


小结

第一次排序在0~N-1个数上 确定了N-1位置上的数

第二次排序在0~N-2个数上 确定了N-2位置上的数

第三次排序在0~N-3个数上 确定了N-3位置上的数

还是一个等差数列 a N^2 + b N + c

还是O(N^2)复杂度的算法

冒泡排序代码

image.png



异或运算


相同为0 不同为1

image.png

异或还可以理解为无进位相加

比如0和1相加是1 1和1项加是0 不进位

异或运算性质

  • 0^N=N;N^N=0

0和任何数异或都是N 任何数和自己异或都是0

  • 异或运算满足交换律和结合律

a^b=b^a;(a^b)^c=a^(b^c)

  • 同样一批数亦或得到的结果和选择谁先谁后去异或无关

a、b值交换

image.png

第一行 a=a^b a为甲 b为乙 a=a^b即a=甲^乙,b为乙

第二行 b=a^b

a=甲^乙,b=甲^乙^乙

根据任何一个数异或自己都为0得乙^乙=0

根据任何一个数异或0都为自己得甲^0为甲 所以b=甲

第三行a=a^b 甲^乙^甲=乙

所以就实现了交换数据的效果

用异或的前提是 a和b所指向的内存是两块不同的东西,值可以一样 比如甲=乙

如果内存一样 同样的内存区域和自己异或 值都会变成0了


大厂面试题


要求

时间复杂度O(N)、额外空间复杂度O(1) 只用有限几个变量

2个题目

1)

一个int[]整型数组中只有一种数出现了奇数次

其他数出现偶数次

怎么找到出现了奇数次的数

解题

定义一个变量 int eor=0;

定义一个数组int [a,b,c....]

用这个变量去异或数组中的每一个元素

eor ^ a eor ^ b eor ^ c

最后这个eor就是出现了奇数次的数

比如这个数组是 [2,1,3,1,3,1,3,2,1]

因为异或运算顺序无所谓

等同于 [1,1,1,1,2,2,3,3,3]

4个1异或完是0 2个2异或完是0 3个3异或完是3

代码

image.png

image.png

比如每个数有5个二进制位

如果最高位的1出现奇数个的话 无进位相加的结果就是1

如果最高位出现偶数次1的话 最终结果就是0

所以最终的结果和某一位上1的个数有关 和顺序没有关系

2)

一个int[]整型数组中两种数出现了奇数次

其他数出现偶数次

怎么找到出现了奇数次的数

image.png

假设一个数组中 a和b 出现奇数次 其他的数字others都出现偶数次

如果一个变量eor 从头异或到尾 最终结果是a^b

即先把偶数次异或掉都是0

再和奇数个a异或得到a

再和奇数个b异或得到a^b

又因为是2种数 所以a != b

那么eor一定是不等于0的

即eor 这个32位整数的某一位上至少有一位不等于0

假设eor在第8位上是1

说明a数和b数在第8位上是不一样的

再定义一个变量 eor'

用eor'异或上第8位不是1的那些数

只有某一个数字在第8位不是1才异或进eor‘中 得到a或者b

假设eor'=a 因eor=a^b 所以b=eor^eor'=a^b^a=b


相关文章
|
数据可视化 安全 数据安全/隐私保护
使用Python做个可视化的“剪刀石头布”小游戏
使用Python做个可视化的“剪刀石头布”小游戏
469 0
【📕分布式锁通关指南 08】源码剖析redisson可重入锁之释放及阻塞与非阻塞获取
本文深入剖析了Redisson中可重入锁的释放锁Lua脚本实现及其获取锁的两种方式(阻塞与非阻塞)。释放锁流程包括前置检查、重入计数处理、锁删除及消息发布等步骤。非阻塞获取锁(tryLock)通过有限时间等待返回布尔值,适合需快速反馈的场景;阻塞获取锁(lock)则无限等待直至成功,适用于必须获取锁的场景。两者在等待策略、返回值和中断处理上存在显著差异。本文为理解分布式锁实现提供了详实参考。
485 11
【📕分布式锁通关指南 08】源码剖析redisson可重入锁之释放及阻塞与非阻塞获取
|
Python
【Python】已解决:ValueError: Worksheet named ‘Sheet’ not found
【Python】已解决:ValueError: Worksheet named ‘Sheet’ not found
1542 0
|
缓存 Linux
揭秘Linux内核:探索CPU拓扑结构
【10月更文挑战第26天】
347 1
|
缓存 应用服务中间件 nginx
运维系列.Nginx中使用HTTP压缩功能(二)
运维系列.Nginx中使用HTTP压缩功能(二)
324 0
|
监控 安全 数据安全/隐私保护
关于云锁
背景 主机,储存数据和承载关键业务系统的主体,是企业IT系统的重要资产。主机的安全一直被认为是整个信息安全领域的最后一道防线。主机的漏洞和弱点一直是攻击者和信息资产所有者激烈争夺的阵地。主机安全规划与加固是专业安全顾问通过对承载重要信息系统的主机进行安全评估,根据客户特定的安全要求,制定主机安全规划与加固方案,采取对系统漏洞进行补丁修补,并优化和加强账号口令、日志、网络性能、文件系统、权限控制、服务进程等等。
|
存储 算法 小程序
小白也能看懂的二维码生成器 API 的技术原理(附Java 接入代码)
二维码生成器 API 是利用是一种通过 Web 服务将文本、链接、图像等信息转化为二维码图像的技术
799 0
小白也能看懂的二维码生成器 API 的技术原理(附Java 接入代码)
|
弹性计算 移动开发 固态存储
阿里云域名优惠券68元、36元和26.2元代金券一键领取中.......
阿里云域名优惠券68元、36元和26.2元代金券一键领取中,阿里云com域名注册69元一年,企业新用户可领取68元代金券,券后注册com域名首年只要1元;个人新用户可以领取36元代金券,券后注册com域名33元首年;新用户可以领取cn域名26.2元代金券,券后注册cn域名首年只要8.8元
879 0
阿里云域名优惠券68元、36元和26.2元代金券一键领取中.......
|
Web App开发 Linux 网络安全
PYNQ-Z2-开箱测试
PYNQ-Z2-开箱测试
1271 0
PYNQ-Z2-开箱测试
|
Linux 编译器 C语言
LINUX入门篇【5】----程序的翻译过程解析
LINUX入门篇【5】----程序的翻译过程解析
254 0

热门文章

最新文章