1. 找出仅出现一次的数字并打印输出(按位异或)
-代码:
import java.util.Scanner;
/**
* 找出仅出现一次的数字并打印输出
* 按位异或--找不同! --交换律
* 0^n=n n^n =0
*/
public class OnlyOnce {
public static int only(int[] arr) {
int ret = 0;
for (int i = 0; i < arr.length; i++) {
ret ^= arr[i];
}
return ret;
}
public static void main(String[] args) {
int[] array = new int[]{1,5,7,9,7,1,5};
int ret = only(array);
System.out.println("仅出现一次的数字为:"+ret);
}
}
-结果:
2. 汉诺塔
-
思路:
把(n-1)个小盘子先转移到中转站
然后余下的一个大盘子转移到目标站
再把(n-1)个盘子放到目标站 -
代码:
import java.util.Scanner;
/**
* 经典递归
* 汉诺塔问题:起始站A 中转站B 目标站C
* 把(n-1)个小盘子先转移到中转站 然后余下的大盘子转移到目标站 再把(n-1)个盘子放到目标站
*/
public class Hanoi {
public static int count = 0; //静态成员变量
public static void move(char a, char b) {
System.out.print(a+"->"+b+" ");
}
// 盘子个数 起始 中转 目标
public static void hanoi(int n, char a, char b, char c) {
if(n > 0) {
count++;
if(1 == n) {
move(a,c);
} else {
hanoi(n-1,a,c,b); //前(n-1)至中转站
move(a,c); //max至目标站
hanoi(n-1,b,a,c); //(n-1)个从中转站至目标站
}
} else {
System.out.println("非法输入!");
}
}
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
System.out.println("请输入盘子个数:");
int n = reader.nextInt();
System.out.println("移动过程:");
hanoi(n,'A','B','C');
System.out.println();
System.out.println("移动次数:");
System.out.println("count = "+count);
}
}
- 结果: