java代码实现:12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?

此题参考与其他人思路, 2个解题方式。

1.

 1 /**
 2  * 用java代码实现:12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?
 3  * 状态树方式解
 4  * 用状态生成树的方式来做的,先把12个人按从低到高一次编号,
 5  * 从(1 ; 2)出发,加入3和4的时候生成(1,3 ; 2,4)和(1,2 ; 3,4),
 6  * 然后加入5和6,分别从前面的两个状态出发,可以生成5种状态,就是说6个人时有5种排列
 7  * @author amos-s
 8  * @Time:2017年3月10日 下午6:18:37
 9  * @version 1.0
10  */
11 public class LineUpProblem {
12
13     private int count = 0;
14     private int total = 0;
15     private Stack<Integer> place = new Stack<Integer>();
16
17     public LineUpProblem(int total) {
18         this.total = total;
19     }
20
21     private void lineOrder(int order, int level) {
22         place.push(order);
23         if (level >= total / 2) {
24             count++;
25             for (Integer integer : place) {
26                 System.out.print(integer);
27             }
28             System.out.println();
29             place.pop();
30             return;
31         }
32
33         for (int i = order + 1; i < 2 * (level + 1); ++i) {
34             lineOrder(i, level);
35         }
36         place.pop();
37     }
38
39
40     public void lineOrder() {
41         lineOrder(1, 1);
42         System.out.println("第一排一共有" + count + "种排列");
43     }
44
45     public static void main(String[] args) {
46         LineUpProblem line = new LineUpProblem(12);
47         line.lineOrder();
48     }
49 }

2.

 1 /**
 2  *  用java代码实现:12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?
 3  *    1.目前数是{0,1,2,3,4,5}, ++操作后,数变为{0,1,2,3,4,6},因为6小于且等于位置5的最大值2n = 10,所以此组合是个符合要求的组合。
 4
 5  *    2.又如目前数是{0,1,2,3,4,10}, ++操作后,数变为{0,1,2,3,4,11},因为11大于位置5的最大值2n = 10,
 6     因此要进位,这样位置4的数++,再检查位置4的数++后是5,小于且等于位置4的最大值2n = 8,这个位置符合条件,
 7     而位置5的数要置"0",这个0不能是再从范围的起始值开始,而是要等于位置4的数+1.因为从起始值开始的数肯定是小于位置4的值的。
 8
 9  *    3.以此类推,如果目前数是{0,1,4,6,8,10},++操作后,需要进位,一步一步往前进位,最终进位位置1的数,数就变成了{0,2,5,7,9,11},
10     然后要把位置1之后位置的每个位置的数置"0", 等于前一个位置的数+1,这样最后数就是{0,2,3,4,5,6}.
11
12  *    4.检查此数组合是否符合条件是,检查最后一个数是否小于且等于其位置的最大值。
13  *
14  * @author amos-s
15  * @Time:2017年3月10日 下午6:18:37
16  * @version 1.0
17  */
18 public class LineUpProblem2 {
19
20     private int count = 0;
21     private int total = 0;
22
23     public LineUpProblem2(int total) {
24         this.total = total;
25     }
26
27     private void lineOrder() {
28         //No.1
29         //开始写代码,求排列方式有多少种
30         if (total % 2 != 0)
31             return;
32         //初始化数组,并完成第一种排列
33         int[] data = new int[total / 2];
34         for (int i = 1; i < data.length; ++i) {
35             data[i] = i;
36         }
37         count++;
38         //保存操作数组的位置
39         int i = data.length - 1;
40         int allCount = 0;
41         while (i >= 0) {
42             43             data[i]++; //要操作的数+1
44             if (data[i] <= i * 2) {
45                 //对其数后面的数字初始化
46                 for (int j = i + 1; j < data.length; ++j) {
47                     data[j] = data[j - 1] + 1; //保证其是前一位+1,最小数组合
48                 }
49             } else {
50                 //此位置已达最大值,操作其前面一位
51                 i--;
52                 continue;
53             }
54             //检查最后一位的数是否小于且等于其位置的最大值,如果是的话,此数组合符合要求
55             System.out.println(data[data.length - 1]);
56             if (data[data.length - 1] <= data[data.length - 1] * 2) {
57                 count++; //排列方式+1
58                 // 把++操作的数的位置置回最后一个位置。
59                 i = data.length - 1;
60             } else {
61                 // 如果大于其位置的最大值,说明已遍历完毕,超过了此数组合的最大值。
62                 break;
63             }
64
65         }
66
67
68         //end_code
69     }
70
71     public void lineOrder() {
72         lineOrder();
73         System.out.println("第一排一共有" + count + "种排列");
74     }
75
76     public static void main(String[] args) {
77         LineUpProblem2 line = new LineUpProblem2(12);
78         line.lineOrder();
79     }
80 }
时间: 2024-12-23 03:32:51

java代码实现:12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?的相关文章

C++12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?

#include <iostream> #define DefaultSize 9 //问题描述: //12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? using namespace std; class Grial { public: Grial(int sz=DefaultSize) { visted = new bool [sz]; data = new int [sz]; size = sz; for(int i=1;i<

【编程题目】12 个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,

80.阿里巴巴一道笔试题(运算.算法)问题描述:12 个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? 我的思路:输入从小到大排列的数字  把数字4个分为一组 如下: min **** B A    **** max 其中第一个数字一定是当前最小的, 最后一个数字一定是当前最大的. 其次,设位置A .B,这样去掉这四个数字, 问题又变成了规模小一些的同样的问题. 关键是A和B的确定,有很多种可能,我们依次尝试,如果不满足问题的条件了,就退出来

计算器的方式有多少种?

今天一个同事问了我个问题,问我要实现一个计算器的方式有多少种?突然感到有种想笑的冲动,何故问这样的问题呢?他说C#是种非常美妙的语言,设计的又非常完美,我想知道这样的语言那把这个简单的问题如何的实现!我大致想了想也确实如此.在此想和大家分享一下计算器的实现心得! 要实现这样一个功能实在是太容易了,就看你怎样的想去实现它了,本人分析了以下八种供大家参考: 001.计算器的面向过程版本? 002.计算器的面向对象版本? 003.计算器的工厂模式版本? 004.计算器的多态抽象方法版本? 005.计算

【编程题目】四对括号可以有多少种匹配排列方式?比如两对括号可以有两种:()()和(())

46.搜狐(运算):四对括号可以有多少种匹配排列方式?比如两对括号可以有两种:()()和(()) 跟12个人排高矮的题目差不多. 用 0 表示 “(”,用 1 表示“)” 则需要数字二进制最低8位有 4个1和 4个0,且从低位到高位对1 和 0 计数时,0 出现的次数不能超过 1 出现的次数. /* 46.搜狐(运算): 四对括号可以有多少种匹配排列方式?比如两对括号可以有两种:()()和(()) */ #include <stdio.h> int c_bits(int n) { int re

Java逐行读取文件有多少种方法?

如果每个线程使用的变量都是其它线程不会读取或修改的,那么就不存在一致性问题.同样,如果变量是只读的,多个线程同时读取该变量也不会有一致性问题.否则,将会出现不一致性问题.为了解决数据不一致问题,必须引入某些机制使线程间同步. 当变量修改时间多于一个存储器访问周期,同时读.写操作又相互交替时,潜在的不一致性就会出现.如下图所示: 此时,线程B读取到的数据是错误的.使用一把锁能够解决上述问题: 下面介绍线程的三种同步机制: 1.互斥量pthread_mutex_t 互斥量就是锁,对某段临界区进行加锁

目瞪口呆的 Java 代码技巧你都见过哪几种?

前言: 感谢大家观看本文,希望大家都能有所收获 导语: 从踏入社会以来本人就一直在做 Java 相关的工作,现在终于有时间坐下来,写一篇关于 Java 写法的一篇文章,来探讨一下如果你真的是一个 Java 程序员,那你真的会写 Java 吗? 笔者是一个务实的程序员,故本文绝非扯淡文章,文中内容都是干货,望读者看后,能有所收获. 本文不是一个吹嘘的文章,不会讲很多高深的架构,相反,会讲解很多基础的问题和写法问题,如果读者自认为基础问题和写法问题都是不是问题,那请忽略这篇文章,节省出时间去做一些有

四种java代码静态检查工具

[转载]常用 Java 静态代码分析工具的分析与比较 转载自 开源中国社区 http://www.oschina.net/question/129540_23043 1月16日厦门 OSC 源创会火热报名中,奖品多多哦 »   简介: 本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBugs,PMD,Jtest),最后从功能.特性等方面对它们进行分析和比较,希望能够帮助 Java 软件开发人员了解静态代码

软件开发有多少种方式

软件开发有多少种方式: Build To Learn Build To Show Build To Serve Build To Win 其中Build To Win是我们所学习的构建之法中的核心思想.软件开发是为了什么,是为了市场.赢得了市场,就是这个软件最大的成功.当然一个软件能够成功.就需要在工作中一视同仁,不能有高低贵贱之分.听取小组中每位成员的建议.并且每位程序员也能有很强的工作能力,所以我们必须要在平时的学习在加强对工作能力的训练.为未来的就业打好基础!

UserView--第二种方式(避免第一种方式Set饱和),基于Spark算子的java代码实现

UserView--第二种方式(避免第一种方式Set饱和),基于Spark算子的java代码实现 测试数据 java代码 1 package com.hzf.spark.study; 2 3 import java.util.Map; 4 import java.util.Set; 5 6 import org.apache.spark.SparkConf; 7 import org.apache.spark.api.java.JavaPairRDD; 8 import org.apache.s