- 浏览: 459781 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
ty1972873004:
sunwang810812 写道我运行了这个例子,怎么结果是这 ...
Java并发编程: 使用Semaphore限制资源并发访问的线程数 -
lgh1992314:
simpleDean 写道请问,Logger.setLevel ...
Java内置Logger详解 -
sunwang810812:
我运行了这个例子,怎么结果是这样的:2号车泊车6号车泊车5号车 ...
Java并发编程: 使用Semaphore限制资源并发访问的线程数 -
jp260715007:
nanjiwubing123 写道参考你的用法,用如下方式实现 ...
面试题--三个线程循环打印ABC10次的几种解决方法 -
cb_0312:
SurnameDictionary文章我没看完,现在懂了
中文排序
本篇文章主要用来简单模仿走楼梯或者台阶,列出走完楼梯或者台阶所有的走法。
第一个程序:给定台阶数,每次走1步,2步或者3步。
第二个程序:给定台阶数据,每次走的最小台阶数,每次走的最大台阶数以及设定最多能走几次。采用Stack来实现。
第一个程序和运行结果如下:
/** * 程序主要用来简单模仿走楼梯(台阶). 给定台阶数,每次走1步, 2步 或者 3步, 列出走完台阶所有的走法. * * 例如3级台阶就有四种走法: * 1 1 1 * 1 2 * 2 1 * 3 * * @author Eric * @version 1.0 * */ public class Stairs { // 统计个数 private int currentCount = 1; /** * @param remainingSteps * : 剩余的台阶数,开始调用的值是总的台阶数 * @param currentSteps * : 递归过程中某种情况下,已经走的步骤,如 1 2 走了三步的情况 */ public void walkStairs(int remainingSteps, String currentSteps) { /* * 当剩下小于等于三级台阶时,输出楼梯的走法 */ if (remainingSteps <= 3) { printWalkWays(remainingSteps, currentSteps); } else { for (int step = 1; step <= 3; step++) { walkStairs(remainingSteps - step, currentSteps + " " + step); } } } private StringBuilder getCurrentCountStepInformation(String currentSteps) { return new StringBuilder().append("第").append(currentCount++).append( "种走法").append(currentSteps); } /** * 输出满足条件的台阶走法 * * @param remainingSteps * @param currentSteps */ private void printWalkWays(int remainingSteps, String currentSteps) { if (1 == remainingSteps) { System.out.println(getCurrentCountStepInformation(currentSteps) .append(" 1").toString()); } else if (2 == remainingSteps) { System.out.println(getCurrentCountStepInformation(currentSteps) .append(" 1 1").toString()); System.out.println(getCurrentCountStepInformation(currentSteps) .append(" 2").toString()); } else if (3 == remainingSteps) { System.out.println(getCurrentCountStepInformation(currentSteps) .append(" 1 1 1").toString()); System.out.println(getCurrentCountStepInformation(currentSteps) .append(" 1 2").toString()); System.out.println(getCurrentCountStepInformation(currentSteps) .append(" 2 1").toString()); System.out.println(getCurrentCountStepInformation(currentSteps) .append(" 3").toString()); } else { /** * 0 ==remainingSteps, 表明已经走完台阶了,直接输出就可以了 */ System.out.println(getCurrentCountStepInformation(currentSteps) .toString()); } } public static void main(String args[]) { Stairs s = new Stairs(); // 调用方法前需要先判断STEPS是否是大于0的。 s.walkStairs(5, ""); } }
如走5阶台阶有如下几种走法:
第1种走法 1 1 1 1 1
第2种走法 1 1 1 2
第3种走法 1 1 2 1
第4种走法 1 1 3
第5种走法 1 2 1 1
第6种走法 1 2 2
第7种走法 1 3 1
第8种走法 2 1 1 1
第9种走法 2 1 2
第10种走法 2 2 1
第11种走法 2 3
第12种走法 3 1 1
第13种走法 3 2
第二个程序和运行结果如下:
/** * 题目:走楼梯 * 给定台阶数目 -- SUM, * 每次最大的台阶数 -- MAX * 每次最小的台阶数 -- MIN * 期望值(最多在几步之内完成) -- EXPECT * * 思路: * 采用递归的方法实现。采用Stack结构来存储。 * */ import java.util.Stack; /** * 题目:走楼梯 * 给定台阶数目 -- SUM, * 每次最大的台阶数 -- MAX * 每次最小的台阶数 -- MIN * 期望值(最多在几步之内完成) -- EXPECT * * 思路: * 采用递归的方法实现。采用Stack结构来存储。 * * @author Eric * @version 1.0 * */ public class Stair2 { private Stack<Integer> stack = new Stack<Integer>(); private int currentCount = 0; /** * @param min * @param max * @param current * @param expect * @param sum */ private void getWalkWays(int min, int max, int current, int expect, int sum) { //当Stack中的数据和与总的台阶数一样时,输出结果 if (sum == current) { //输出满足条件的内容,其中,期望值(最多在几步之内完成) if ( expect >= stack.size()) { print(stack); } } //循环最小值到最大值 for (int currentIndex = min; currentIndex <= max; currentIndex++) { /* * 如果当前Stack中的值的和(current)加上当前循环的值(currentIndex) * 小于等于总的台阶数,那么就先把当前循环的值压入到Stack中, * 当前Stack中所有数据值的和加上当选循环的值 * 递归调用getWalkWays方法 * 然后,将stack的pop值去掉并修改Stack中当前所有元素的和 */ if (current + currentIndex <= sum) { stack.push(currentIndex); current += currentIndex; getWalkWays(min, max, current, expect, sum); current -= stack.pop(); } } } /** * 得到输出的前缀。 * 如: * 第50中走法 * @return */ private String getCountInformation() { return new StringBuilder().append("第").append(++currentCount).append( "中走法:").toString(); } /** * 打印当前Stack中的元素 * 如: * 第50中走法:4 4 2 * * @param stack */ private void print(Stack stack) { // 添加满足条件集合的元素个数范围 StringBuilder sb = new StringBuilder(); sb.append(getCountInformation()); for (Object o : stack) { sb.append(o).append(" "); } System.out.println(sb.deleteCharAt(sb.length() - 1).toString()); } /** * 输出符合条件的走楼梯条件信息。 * */ private void printResultTips(int min, int max, int sum, int expectTimes) { System.out.println(new StringBuilder().append("条件==》").append("台阶数为").append(sum) .append(", 每步走的最小台阶数为").append(min).append(", 每步走的最大台阶数为") .append(max).append(",最多走的次数是").append(expectTimes).toString()); } /** * 测试方法 * */ public void test() { int min = 2; int max = 4; int expectTimes = 4; int totalSteps = 10; printResultTips(min, max, totalSteps, expectTimes); getWalkWays(min, max, 0,expectTimes,totalSteps); } public static void main(String[] args) { //测试 new Stair2().test(); } }
条件==》台阶数为10, 每步走的最小台阶数为2, 每步走的最大台阶数为4,最多走的次数是4
第1中走法:2 2 2 4
第2中走法:2 2 3 3
第3中走法:2 2 4 2
第4中走法:2 3 2 3
第5中走法:2 3 3 2
第6中走法:2 4 2 2
第7中走法:2 4 4
第8中走法:3 2 2 3
第9中走法:3 2 3 2
第10中走法:3 3 2 2
第11中走法:3 3 4
第12中走法:3 4 3
第13中走法:4 2 2 2
第14中走法:4 2 4
第15中走法:4 3 3
第16中走法:4 4 2
发表评论
-
工厂类中移除if/else语句
2016-07-10 19:52 847面向对象语言的一个强大的特性是多态,它可以用来在代码中移除 ... -
Java编程练手100题
2014-12-11 17:13 6666本文给出100道Java编程练手的程序。 列表如下: 面 ... -
数组复制的三种方法
2014-11-30 12:57 2172本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
数组复制的三种方法
2014-11-30 12:54 0本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
四种复制文件的方法
2014-11-29 13:21 1681尽管Java提供了一个类ava.io.File用于文件的操 ... -
判断一个字符串中的字符是否都只出现一次
2014-11-25 12:58 2651本篇博文将给大家带来几个判断一个字符串中的字符是否都只出现一 ... -
使用正则表达式判断一个数是否为素数
2014-11-23 13:35 2101正则表达式能够用于判断一个数是否为素数,这个以前完全没有想过 ... -
几个可以用英文单词表达的正则表达式
2014-11-21 13:12 3694本文,我们将来看一下几个可以用英文单词表达的正则表达式。这些 ... -
(广度优先搜索)打印所有可能的括号组合
2014-11-20 11:58 1911问题:给定一个正整n,作为括号的对数,输出所有括号可能 ... -
随机产生由特殊字符,大小写字母以及数字组成的字符串,且每种字符都至少出现一次
2014-11-19 14:48 3936题目:随机产生字符串,字符串中的字符只能由特殊字符 (! ... -
找出1到n缺失的一个数
2014-11-18 12:57 3111题目:Problem description: You h ... -
EnumSet的几个例子
2014-11-14 16:24 8702EnumSet 是一个与枚举类型一起使用的专用 Set 实现 ... -
给定两个有序数组和一个指定的sum值,从两个数组中各找一个数使得这两个数的和与指定的sum值相差最小
2014-11-12 11:24 3281题目:给定两个有序数组和一个指定的sum值,从两个数组 ... -
Java面试编程题练手
2014-11-04 22:49 6648面试编程 写一个程序,去除有序数组中的重复数字 编 ... -
Collections用法整理
2014-10-22 20:55 9795Collections (java.util.Collect ... -
The Code Sample 代码实例 个人博客开通
2014-09-04 18:48 1368个人博客小站开通 http://thecodesample. ... -
Collections.emptyXXX方法
2014-06-08 13:37 2100从JDK 1.5开始, Collections集合工具类中预先 ... -
这代码怎么就打印出"hello world"了呢?
2014-06-08 00:37 7353for (long l = 4946144450195624L ... -
最短时间过桥
2014-04-21 22:03 4068本文用代码实现最短时间过桥,并且打印如下两个例子的最小过桥时间 ... -
将数组分割成差值最小的子集
2014-04-20 22:34 2836本文使用位掩码实现一个功能 ==》将数组分割成差值最小的子集 ...
相关推荐
列出指定目录中所有文件的小程序!列出目录含子文件夹中的文件!
用C/C++ 列出指定目录的所有文件夹和文件用
列出某文件夹下所有文件的完整目录,文件是BAT,直接放目录下运行即可!!超级实用的小工具!!!!!!
Excel VBA工具 可以指定条件, 列出某个文件夹下所有子文件夹和文件
列出文件夹权限列出文件夹权限列出文件夹权限列出文件夹权限
将给定路径的所有文件及文件夹列出至TEXT 直观 采用TREE状列表
Nginx禁止目录列出配置 Nginx禁止目录列出配置 在PHP网站中,在没有进行配置的情况下,攻击者可以通过在网址后面加上“../”或者“/*53.pdf”等语句来读取网站目录,这是不利于服务器和网站安全的。 Nginx禁止目录列...
java 如何列出素数 java 如何列出素数 java 如何列出素数
列出2个IP之间的所有IP值 IP1要 小于 IP2,懒得做判断了
列出注册表"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run"中的所有键值到界面上或文本中;并把自己做的这个程序设置为开机启动。
有时候为了分析SQL 数据库的性能,看看哪些表占用空间比较大或者哪些表数据比较多,然后针对性的去优化表,这时候就需要对所有数据表根据大小进行排序。
1.列出至少有一个员工的所有部门。 2.列出薪金比“SMITH”多的所有员工。 3.列出所有员工的姓名及其直接上级的姓名。 4.列出受雇日期早于其直接上级的所有员工。 5.列出部门名称和这些部门的员工信息,同时列出...
VB之文件处理精彩编程-列出所有正在运行的进程(5KB)
列出exe序的所有子窗口和上层窗口,包括可见和不可见的
本程序用VS2008编译 ...功能:列出服务器名、数据库名,数据库中的表名、试图、存储过程等。可以自动生成SQL语句。创建数据库、表。 数据库的备份恢复。表的修改等。 类似于SQL Server管理器的功能.
列出薪金比周星驰高的所有员工。*/ /*3. 列出所有员工的姓名及其直接上级的姓名。*/ /*4. 列出受雇日期早于直接上级的所有员工的编号、姓名、部门名称。*/ /*5. 列出部门名称和这些部门的员工信息,同时列出那些...
usbdeview 是一款可以列出当前连接到你的计算机上或者曾经连接到你的计算机上的所有 usb 设备的小型实用工具。根据列出的设备的名称和描述,该软件显示了串口号(如果提供),设备添加的日期以及最后连接的日期,...
列出所有工作表.xlsx源码EXCEL VBA宏编程xlsx实例代码下载列出所有工作表.xlsx源码EXCEL VBA宏编程xlsx实例代码下载列出所有工作表.xlsx源码EXCEL VBA宏编程xlsx实例代码下载列出所有工作表.xlsx源码EXCEL VBA宏编程...
USBDeview 是一款可以列出当前连接到你的计算机上或者曾经连接到你的计算机上的所有 USB 设备的小型实用工具。根据列出的设备的名称和描述,该软件显示了串口号(如果提供),设备添加的日期以及最后连接的日期,...
实现列出本地局域网上的所有IP