2021年1月28日–算法
视频教程:
https://www.bilibili.com/video/BV1KA411x7oA?from=search&seid=9102962925755536138
https://www.bilibili.com/video/BV14x411L7zh?from=search&seid=15891911922191337389
知识
1.位运算
1.位逻辑运算符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-czXnn4yM-1611845908843)(C:\Users\31677\AppData\Roaming\Typora\typora-user-images\image-20210128145144871.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A61g4m37-1611845908849)(C:\Users\31677\AppData\Roaming\Typora\typora-user-images\image-20210128145258005.png)]
2.位移运算符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DytcGywy-1611845908853)(C:\Users\31677\AppData\Roaming\Typora\typora-user-images\image-20210128145033417.png)]
练习
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gtHIuBW5-1611845908859)(C:\Users\31677\AppData\Roaming\Typora\typora-user-images\image-20210128222342990.png)]
实践
该题目是1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现
一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空
间,能否设计一个算法实现?
package test20210128;
import java.util.Random;
public class Demo1 {
//swap函数用于交换数组中的元素位置
public static void swap(int[] a, int i, int j) {
int t = a[i];
a[i] = a[j];
a[j] = t;
}
public static void main(String[] args) {
int N = 1001;//该数组长度为1001
int[] arr = new int[N];
//对数组元素的前十个进行赋值
for(int i = 0;i<arr.length-1;i++){
arr[i]=i+1;
}
//对数组最后一个元素赋值为一个1-10之间的随机数
arr[arr.length-1] = new Random().nextInt(N-1)+1;
//创建一个变量,赋值为0-10之间的随机数,该变量是一个下标,用于交换元素位置时使用
int index = new Random().nextInt(N);
//对数组arr交换下标为index的元素和下标为length-1的元素
swap(arr,index,arr.length-1);
//输出数组
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
System.out.println();
//int N = 11;
//异或运算中任何数字与0进行异或运算都得到该数字本身
//异或运算满足结合律(即(a^b)^c == a^(b^c))
//对于任何数x,都有x^x=0,所以该寻找重复数的方法是通过异或进行相同元素的消除,同时剩下的就是要寻找的多余的数
int x1=0;
for(int i =1;i<=N-1;i++){
x1=(x1^i);
}
for(int i=0;i<N;i++){
x1=x1^arr[i];
}
System.out.println(x1);
}
}
总结
1.位运算实际是16位或者32位或者64位二进制表示的数字进行运算的结果
拓展:
1.同时还有无符号左移(右移)
2.可以用这种方法进行消除操作,A^A=0
3.任何数与0异或操作都得到这个数本身
例如:0^1=1 1^1=0 23=1(010011=001) 0^5=5
2.注意short和byte型的数属于低精度数,不适合做无符号位运算(<<<或者>>>)
参考博客:
https://blog.csdn.net/sinat_35121480/article/details/53510793
的数属于低精度数,不适合做无符号位运算(<<<或者>>>)
参考博客:
https://blog.csdn.net/sinat_35121480/article/details/53510793