1. 用1、2、3、4、5这五个数字,用java写一个main函数,打印出所有不同的排列,如:51234、41235等。
- public class TestQuestion {
- static int[] bits = new int[] { 1, 2, 3, 4, 5 };
-
-
-
-
- public static void main(String[] args) {
- sort("", bits);
- }
-
- private static void sort(String prefix, int[] a) {
- if (a.length == 1) {
- System.out.println(prefix + a[0]);
- }
-
- for (int i = 0; i < a.length; i++) {
- sort(prefix + a[i], copy(a, i));
- }
- }
-
- private static int[] copy(int[] a,int index){
- int[] b = new int[a.length-1];
- System.arraycopy(a, 0, b, 0, index);
- System.arraycopy(a, index+1, b, index, a.length-index-1);
- return b;
- }
- }
- 2. 对第一题增加难度,用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。
基本思路:
2-1. 把问题归结为图结构的遍历问题。图遍历思想:实际上6个数字就是六个结点,把六个结点连接成无向连通图,对于每一个结点求这个图形的遍历路径,所有结点的遍历路径就是最后对这6个数字的排列组合结果集。
2-2. 显然这个结果集还未达到题目的要求。从以下几个方面考虑:
2-2-1. 3,5不能相连:实际要求这个连通图的结点3,5之间不能连通, 可在构造图结构时就满足改条件,然后再遍历图。
2-2-2. 不能有重复: 考虑到有两个2,明显会存在重复结果,可以把结果集放在TreeSet中过滤重复结果
2-2-3. 4不能在第三位: 仍旧在结果集中去除满足此条件的结果。
采用二维数组定义图结构,最后的代码是:
- import java.util.Iterator;
- import java.util.TreeSet;
-
- public class TestQuestion {
-
- private String[] b = new String[]{"1", "2", "2", "3", "4", "5"};
- private int n = b.length;
- private boolean[] visited = new boolean[n];
- private int[][] a = new int[n][n];
- private String result = "";
- private TreeSet set = new TreeSet();
-
- public static void main(String[] args) {
- new TestQuestion().start();
- }
-
- private void start() {
-
-
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- if (i == j) {
- a[i][j] = 0;
- } else {
- a[i][j] = 1;
- }
- }
- }
-
-
- a[3][5] = 0;
- a[5][3] = 0;
-
-
- for (int i = 0; i < n; i++) {
- this.depthFirstSearch(i);
- }
-
-
- Iterator it = set.iterator();
- while (it.hasNext()) {
- String string = (String) it.next();
-
- if (string.indexOf("4") != 2) {
- System.out.println(string);
- }
- }
- }
-
- private void depthFirstSearch(int startIndex) {
- visited[startIndex] = true;
- result = result + b[startIndex];
- if (result.length() == n) {
-
- set.add(result);
- }
- for(int j = 0; j < n; j++) {
- if (a[startIndex][j] == 1 && visited[j] == false) {
- depthFirstSearch(j);
- } else {
- continue;
- }
- }
-
-
- result = result.substring(0, result.length() -1);
- visited[startIndex] = false;
- }
- }
- 以上引用原址:http://www.blogjava.net/SongJunke/articles/101741.html
3. 递归思想。递归要抓住的关键是:(1)递归出口;(2)地推逐步向出口逼近。
3-1. 汉诺塔
这是递归的超经典的例子,几乎每本程序设计书上谈到递归都会介绍。具体情景不再赘述。以我上述的方法观之:
3-1-1. 递归的出口在于disk数为一的时候
3-1-2. 向出口逼近:如果不是一,是n ,则我们先挪动上面n-1块disk,等上面挪完,即递归返回的时候,我们挪动最底下的disk.
仅仅如此,一个貌似十分复杂的问题就解决了,因为挪动那n-1块disk的时候,会继续向上减少,直到disk的数量为一为止。下面给出代码:
- import javax.swing.JOptionPane;
- public class Hanoi{
- private static final String DISK_B = "diskB";
- private static final String DISK_C = "diskC";
- private static final String DISK_A = "diskA";
- static String from=DISK_A;
- static String to=DISK_C;
- static String mid=DISK_B;
- public static void main(String[] args) {
- String input=JOptionPane.showInputDialog("please input the number of the disks you want me move.");
- int num=Integer.parseInt(input);
- move(num,from,mid,to);
- }
- private static void move(int num, String from2, String mid2, String to2) {
- if(num==1){
- System.out.println("move disk 1 from "+from2+" to "+to2);
- }
- else {
- move(num-1,from2,to2,mid2);
- System.out.println("move disk "+num+" from "+from2+" to "+to2);
- move(num-1,mid2,from2,to2);
- }
- }
- }
分享到:
相关推荐
很早以前写的算法演示程序,用动画的方式演示顺序查找、二分查找、冒泡、快速排序、选择排序等算法。 可以显示当前的算法代码以及当前正在执行的语句,并可...放到要发霉了,拿出来给大家看看,如有转载,请注明出处 :)
根据提供的文件内容,本文将详细解析RSA算法的基本概念、工作原理及其实现步骤,并通过具体的Java代码示例来展示如何实现这一加密算法。 ### RSA算法概述 RSA算法是一种非对称加密技术,由Ron Rivest、Adi Shamir ...
地图管理:添加、修改、编辑、删除地图 游戏相关:选关卡、操作蛇、AI电脑蛇、粒子特效、音效 ...版权声明:本文为CSDN博主「刘建杰」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
矢量寻路源码由 翼尘 Leo泥偶原创 如需转载请声明出处 原创矢量寻路算法,可以用于各种游戏的自动寻路系统,改进之后还可以有其他用途,核心代码在Role类中,具体实现请访问: ...
个人创作,转载需说明,用于计算区域内某一时间段船舶排放。
java笔试题算法 目录 :envelope: 说明 项目介绍 该文档主要是笔主在学习 Java 的过程中的一些学习笔记,但是为了能够涉及到大部分后端学习所需的技术知识点我也会偶尔引用一些别人的优秀文章的链接。文档大部分内容...
骆昊还增加了数据结构、算法、大型网站架构、设计模式、UML、Spring MVC等主题的深度解析,特别关注了如hashCode方法设计、垃圾收集、并发编程和数据库事务等关键知识点。 文章在CSDN上的访问量超过5万次,并被多个...
利用Java对DES算法的加密和解密,需要的转载!
同时修正多出BUG,更改某些算法,提高管理效率。 3.运用了XML应用,国际化,鼠标点击事件,系统托盘图标,中国大陆身份证验证算法(18位)等等。 注:国际化未完全,若你有兴趣可更改源码 <br>购物流程: 管理...
通过阅读《Java常见面试题.doc》、《Java面试题1.htm》、《5559.htm》、《Java面试题2.htm》、《java面试笔试题大汇总 及c-c++面试试题(转载 ) - happyfish - BlogJava.mht》以及《Java常见面试题.txt》等文件,您...
标题中的"IBE-master"指的是基于身份的加密(Identity-Based Encryption, IBE)的主项目,这是一个专注于加密解密算法的Java实现。IBE是一种公钥加密技术,它允许使用接收者的身份(例如电子邮件地址或用户名)作为...
java 源码编辑 虫洞 · 技术栈 | 沉淀、分享、成长,让自己和他人都能有所收获! 作者: 小傅哥,Java Developer, 本文档是作者小傅哥多年从事一线互联网Java开发的学习历程技术汇总,旨在为大家提供一个较清晰详细...
java8 源码 目录(ctrl + f 查找更香) 项目准备 面试知识点 公司面经 Java 基础 容器(包括juc) 并发 JVM Java8 计算机网络 计算机操作系统 Linux 数据结构与算法 数据结构 算法 数据库 MySQL mysql(优化思路) ...
java 源码分析 工具 声明 关于仓库 本仓库是笔者在学习过程中的知识总结,内容以Java后端的知识总结为主。 【个人博客】 Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ ...算法 ...Java ...算法 ...Java ...《转载说明》 向优秀的大佬们致敬
微信公众号目录算法Java虚拟机春天SpringMVC高并发架构基石-缓存网络篇架构其他主意书单《 Java编程思想(第4版)》-Java领域的圣经,建议稍微有点基础后阅读。不推荐初学者阅读,小心被劝退《深入理解Java虚拟机》-...
本仓库为【Java工程师技术指南】力求打造最完整最实用的Java工程师学习指南!这些文章和总结都是我近几年学习Java总结和...目录计算机网络操作系统Linux相关数据结构与算法数据结构算法数据库MySQL缓存Redis消息队列K
数据挖掘贝叶斯算法Java实现 数据挖掘贝叶斯是一种实现贝叶斯数据分类的算法,该算法使用Java语言实现,主要用于小规模数据集的实验和测试,不适合用于工程应用。该算法假定训练数据各属性列的值均是离散类型的,...
【标题】:“[转载] Clustering经典范文学习” 这篇博文主要探讨了Clustering(集群)在IT领域的应用,特别是从J2EE(Java 2 Platform, Enterprise Edition)的角度出发,深入学习集群技术的重要性和实现方式。...
leetcode下载 LeetCode ...1.所有代码均为原创,可随意转载、使用、修改; 2.代码以简洁明了为原则,逻辑清晰; 3.欢迎大家随时交流,给予意见和建议; 菜鸟作者希望和大家一起进步! 加油!加油!加油!