package com.example.demo.algorithm;
/**
* @Description :
* 如何不用额外变量交换两个数
*
*普通公式:
* 异或运算:相同为0,不同为1
* 同或运算:相同为1,不同为0
* 超级公式:
* 异或运算 = 无进位相加
*
* 异或运算的性质:
* 1)、0^N=N N^N=0
* 2)、异或运算满足交换律和结合律
*
* @Author : Darren
* @Date : 2021 年 02 月 07 日 20:06:18
* @since : 1.0
*/
public class J008_SwapVariable {
public static void main(String[] args) {
int maxSize = 100;
int maxValue = 100;
int[] arrays = J001_SelectSort.generateRandomArray(maxSize, maxValue);
System.out.println("before: ");
J001_SelectSort.printArray(arrays);
swap(arrays, 0, arrays.length-1);
System.out.println("end: ");
J001_SelectSort.printArray(arrays);
}
/**
* 两个变量交换不申请额外遍历
* 注意:
* 变量1和变量2必须不相等或者值相等内存地址不能相等,否则两个相同的变量异或会变成0
*
* @param arrays
* @param var1 变量1
* @param var2 变量2
*/
public static void swap(int[] arrays, int var1, int var2){
if (arrays == null || arrays.length < 2){
return;
}
//var1 = 3 var2=4
//第一行执行 var1 = 3^4 var2=4
arrays[var1] = arrays[var1] ^ arrays[var2];
//第二行执行 var1 = 3^4 var2=4^3^4=3
arrays[var2] = arrays[var1] ^ arrays[var2];
//第三行执行 var1 = 4 var2=3
arrays[var1] = arrays[var1] ^ arrays[var2];
}
}