异或运算的简单算法应用
概念:不进位相加
即相同为零,不同为一 ;0和任何数异或都等于那个数本身,
交换两个变量(不能是同一个引用地址,不然会消掉)的位置
a= 1 b=2
a=a^b
b=a^b
a=a^b
最终结果a=2 b=1
题目:
1)一个数组中一个数出现了奇数次一个数出现了偶数次
解题思路:定义一个eor1=0去异或整个数组最后留下来的那个数就是那个出现奇数次的数
2)一个数组中两个数出现了奇数次一个数出现了偶数次
解题思路://定义一个eor1=0去异或整个数组最后留下来eor就是那两个出现奇数次的数且eor不等于0
int eor1 = 0;
for(int i =0;i<arr.length;i++){
eor1 ^= arr[i];
}
//这说明eor肯定有一位不等于0,假设他是整数占四个字节即三十二位中肯定有一个不等于0
//获得不等于0的那位数
rightOne = (~eor1+1) & eor1
//再定义一个eor2去异或那个不等于0位置的那些数最后eor2得到的结果就是a or b
int eor2 = 0
for(int i =0;i<arr.length;i++){
if((cur & rightOne) == 0){
eor2 ^= arr[i];
}
}
//再用eor2^eor1得到另一个数
常用排序算法
冒泡排序
从左往右,两两相互比较大小,左边的大就交换位置,循环往复,把较大的放后面。
选择排序
是从第一个数开始,与后面所有的数相比较,找出最小的数,放在第一个位置,以此类推,每一轮确定一个相对于这一轮最小的数
插入排序
从区间最有位置向前看,如果比前面小向右移,如果不比前面小,或者前面没有数时结束循环
0-0位置有序,从0往前看
0-1位置有序,从1往前看
0-2位置有序,从2往前看
...
0-n-1位置有序,从n-1往前看
二分查找:
查找一个数存不存在,
查找<=num的最左或>=num的最右,
某个浮动区间的极值
归并排序
通俗来说就是两个有序数组,然后双指针,分别指向两个数组开头,当不越界的时候会找小的放在数组里
例:合并两个有序数组 - 提交记录 - 力扣(LeetCode)
归并排序变种,求逆序对文图
数组中的逆序对 - 数组中的逆序对 - 力扣(LeetCode)
快速排序
荷兰国旗问题
堆排序
剑指 Offer 49. 丑数 - 丑数 - 力扣(LeetCode)
计数排序
基数排序
桶排序
这种不基于比较的排序都是根据数据状况来定的
排序算法稳定性
值相同,绝对位置变后,原来的相对位置保持不变