使用异或快速交换两个数的值,不用写临时变量
原理是异或可以找出奇数次出现的数
import java.util.Scanner;
public class Text {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a=51;
int b=33;
a=a^b;
// 此时a=a^b,b=b
b=a^b;
// 此时b=a^b^b 结果为a
a=a^b;
// 此时a=a^b^a 结果为b
}
}
提取一个数二进制最右侧的1
n&((~n)+1)
取反加一再进行同原数进行与操作
import java.util.Scanner;
public class Text {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = 7;
// 7=111,最右侧1为1
System.out.println(~a);
System.out.println(~a+1);
System.out.println(a & (~a+1));
}
}
在一大堆数中有两个不同数出现了奇数次,别的数都是偶数次,提取出这两个数
异或偶数次时,结果为0 1异或1=0 ,1 异或1异或1=1
异或所有数,得到结果res,最终会得到两个数异或的结果,偶数次的数不造成影响,然后提取出最右边的1,flag,要找的两个数必不一样,肯定会有不一样的一位。把一大堆数按flag分成两类,要找的两个数也会被分在这两类中,即,一个数在flag为 1类中,另一个数在flag=0类中,再用之前res进行分类异或,得到要寻找的第一个数a,a异或res,得b
import java.util.Scanner;
public class Text {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = 0, b = 0;
int y[] = {1, 1, 5, 2, 2, 3};
int res = 0;
for (int i = 0; i < y.length; i++) {
res = res ^ y[i];
}
int flag = res & (~res + 1);
int c=0;
for (int i = 0; i < y.length; i++) {
if ((flag&y[i])==0) {
a = res ^ y[i];
}
}
System.out.println(a);
System.out.println(res^a);
}
}
数一个数中有几个二进制一
取一个最右边1异或一次,直到a为0
import java.util.Scanner;
public class Text {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a=sc.nextInt();
int c=0;
int flag = 0;
while (a!=0){
flag = a & (~a + 1);
c++;
a^=flag;
}
System.out.println(c);
}
}
全排列
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
public class Text {
public static void all(String s[],HashSet<Integer> used,
String y,ArrayList<String> list){
if (used.size()==s.length)
list.add(y);
else {
for (int i = 0; i <s.length ; i++) {
if (!used.contains(i)){
used.add(i);
all(s,used,y+s[i],list);
used.remove(i);
}
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s[]={"a","b","c"};
String y = "";
HashSet<Integer> used=new HashSet<>();
ArrayList<String> list=new ArrayList<>();
all(s,used,y,list);
for (String s1:list
) {
System.out.println(s1);
}
}
}