0
点赞
收藏
分享

微信扫一扫

【JAVA】汉诺塔(递归) + 异或找仅出现一次数

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. 汉诺塔

  1. 思路:
    把(n-1)个小盘子先转移到中转站
    然后余下的一个大盘子转移到目标站
    再把(n-1)个盘子放到目标站

  2. 代码:

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);
    }
}
  1. 结果:
    结果
举报

相关推荐

0 条评论