`
guiqing85
  • 浏览: 168779 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

一个排列数字的算法笔试题

阅读更多
原题如下:用1、2、2、3、4、5这六个数字,用java写一个程序,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。

解题思路:

很明显,这是一个递归算法。我们可以排列将这6个数按从小到大的顺序排一下,如果是1,2,3,4,5,6,那么会有1*2*3*4*5*6=6!=720个递增的数。但如果是1,2,2,3,4,5,那么在这720个数中一定会有相同的数对出现(由于在这6个数中只有两个数两同,也就是说,如果有重复的数,那么一定是一对数,如122345会出现两次)。

排列的基本规则是分步进行。也就是说,要排列上面6个数,首先应该选择第一个数,这第一个数可以选择这6个数中的任意一个,如选择1.第二步是选择第二个数,这第二个数不能再选择已经选过的数,如1.因此,它只能从后面5个数中选择。如选择2。以此类推。

我们也可以在程序中模拟这一过程。源程序如下:

public class test1 {
     private int[] numbers = new int[] { 1, 2, 3, 3, 4, 5 };
     public int n;
     private String lastResult = "";
     private boolean validate(String s) {
          if (s.compareTo(lastResult) <= 0)
               return false;
          if (s.charAt(2) == '4')
               return false;
          if (s.indexOf("35") >= 0 || s.indexOf("53") >= 0)
               return false;
          return true;
     }

     public void list(String index, String result) {
          for (int i = 0; i < numbers.length; i++) {
               if (index.indexOf(i + 48) < 0) {
                      String s = result + String.valueOf(numbers[i]);
                      if (s.length() == numbers.length) {
                           if (validate(s)) {
                                System.out.println(s);
                                lastResult = s;
                                n++;
                           }
                          break;
                      }
                      list(index + String.valueOf(i), s);
               }
          }
     }

     public static void main(String[] args) {
          test1 t = new test1();
          t.list("", "");
          System.out.println("总数:" + t.n);
     }
}

其中list函数是这个算法的核心函数。index参数表示已经选择过的数,用numbers数组的索引表示。如index="012",表示numbers的前三个数已经被选择,也表示应该选择第四个数了,而这第四个数应该从后三个数中选择。result参数表示临时的数字组合(这个数字组合最多是5个数字,因为,如果到了6个数字,就表示已经有一个结果产生了)。在默认情况下index和result的值都是""。

在validate中使用了 if (s.compareTo(lastResult) <= 0)进行判断,由于按这种方法进行排列,如果这6个数是递增给出的,那么排列的结果一定是递增的,但上述的6个数其中第2和第3个位置上都是2,因此,如果出现了上一个结果不小于当前结果的情况,一定是有重复了,因此,要将这部分数过滤出去。

使用1, 2, 2, 3, 4, 5的测试结果
122345
122543
123245
123254
123425
123452
125234
125243
125423
125432
132245
132254
132425
132452
132524
132542
142325
... ...
... ...
542313
542331
543123
543132
543213
543231
543312
543321
总数:118

使用1, 3, 3, 3, 4, 5的测试结果

133345
313345
315433
331345
331543
333145
333154
333415
333451
343315
345133
433315
451333
513334
513343
513433
541333
543133
543313
543331
总数:20
分享到:
评论

相关推荐

    常见IT公司笔试算法题

    - **模运算**:使用模运算判断一个数是否能被另一个数整除。 - **输出控制**:控制输出格式,确保每个因数后面都有乘号。 #### 6. 子字符串提取 ```c int GetSubString(char *strSource, char *strResult) { int...

    数据结构和算法笔试题

    循环算法通过预设前一个节点为null,然后依次将当前节点与前一个节点互换,最后返回新的头节点。递归算法则是通过递归调用自身,将链表的剩余部分反转后,再调整当前节点及其后续节点的连接关系。 2. 广度优先遍历...

    vcmianshi.rar_c++ thread_算法笔试面试_算法面试题_马戏团

    C++程序员面试、笔试经常遇到的一些算法示例集 pdf,相关内容:字符串匹配的KMP算法,括号匹配检测、求一个数组的最长递减字序列、一些数字题求解,输出一个字符串的所有组合,马戏团表演问题、Thread.sleep 与obj....

    部分IT公司笔试算法题

    本题要求分解一个整数为其所有质因数的乘积形式。主要考察质数判断方法、循环控制结构等。 **代码解析:** ```c void prim(int m, int n) { if (m &gt; n) { // 处理大数 while (m % n != 0) n++; // 找到最小的因子...

    一著名软件公司的java笔试算法题!

    递归的过程中,每次都是将一个数字移动到序列的最前面,并检查新的序列是否满足条件。如果新序列比之前生成的序列小或者不满足题目约束,则放弃当前序列。 代码中定义了一个`test`类,包含几个关键方法: 1. `shift...

    宏利金融java笔试题1

    宏利金融java笔试题1 一、 equals()和"=="的区别 在 Java 中,equals() 和 "==" 是两个不同的概念。"==" 是一个比较符号,用于比较两个对象的内存地址是否相同,而 equals() 是一个方法,用于比较两个对象的内容...

    豆瓣网校园招聘笔试题

    从给定的豆瓣网校园招聘笔试题中,我们可以提炼出一系列与计算机科学和软件工程相关的知识点,涵盖了数据结构、概率论、C++编程基础、SQL查询、字符串处理、算法复杂度以及动态规划等方面。下面是对这些知识点的详细...

    腾讯笔试题2010

    ### 腾讯笔试题2010知识点详解 #### 1. `const` 的含义及实现机制 **知识点概述**: - `const` 关键字用于声明一个只读变量,意味着一旦赋值后,其值不能被改变。 - 在C++等语言中,`const` 变量在编译期间就被...

    深信服2007笔试题

    在深信服的笔试题中,主要涵盖了计算机科学和编程的基础知识,包括序列规律推理、C++语法、网络通信方式、操作系统原理以及算法设计。以下是对这些知识点的详细解析: 1. **序列规律推理**: 题目中的数字序列...

    2015年苏州移动研发中心笔试题

    综上所述,这份笔试题涵盖了多个IT领域的基础知识,包括但不限于算法稳定性分析、Linux系统结构、位运算应用以及排序算法的设计与实现等。这些问题不仅考察了应聘者的基础理论知识,还测试了他们实际解决问题的能力...

    2018年小米秋招硬件题

    该问题是一个数字规律变化题。数字序列的下一个数字可以根据前一个数字的规律来确定。例如,给定的数字序列是87, 57, 36, 19, 10,可以根据规律确定下一个数字为9。 11. 编程题有一个数组(非递减),旋转了不知道...

    美团2017秋招笔试真题-前端开发、运维工程师.docx

    线性表是最基本的线性结构,其中每个元素只有一个前驱和一个后继。 - **b. 栈与队列是非线性结构**:错误选项。栈和队列都属于线性结构。 - **c. 线性链表是非线性结构**:错误选项。线性链表也是一种线性结构,只是...

    2007百度笔试题.txt

    ### 2007百度笔试题解析 #### 选择题 1. **题目**: 在以下选项中,哪个关键字与其他三个不同? - A. Shell - B. 鲢 - C. 法 - D. 选 **知识点**: - 这个问题显然存在一定的误导性。在计算机领域,“Shell...

    2014美团校园招聘笔试题-产品类经理.doc

    【美团2014年产品类经理笔试题】是一份针对应聘美团产品类经理岗位的校园招聘笔试题目,主要包括逻辑推理、数学问题、互联网产品理解以及编程能力的考察。这份试题旨在评估候选人的综合能力,特别是解决问题和逻辑...

    玄武科技2022招聘Java开发工程师岗位笔试题

    ### 知识点详解 #### 1. 三次握手 三次握手是TCP协议建立连接时的一个过程,...以上是玄武科技2022校园招聘Java开发工程师岗位笔试题中提到的关键知识点,涵盖了网络协议、编程语言基础、算法和设计原则等多个方面。

    2015小米校招技术类笔试题.pdf

    1. 回文数检测算法:在笔试题中,首先要求编写一个函数检测一个数字是否是回文数,即从前往后和从后往前读都一样的数。这个问题考察了基本的字符串处理能力和算法逻辑。实现时,需要考虑将数字转换为字符串,然后...

    46家大型公司的笔试题

    ### 46家大型公司的笔试题知识点解析 #### 一、程序完善与调试 ##### 1. 完成星号图案打印程序 该题目要求完成一个打印特定星号图案的程序。程序通过嵌套循环来控制星号的输出位置。 **代码分析与补充** ```c #...

    杭电计算机院 复试笔试题包括2016年

    题目给出了一个文本文件,要求编写程序从中提取数字,每行输出五个数字,并计算所有数字的和。解决此类问题需要对字符串进行操作,可以通过正则表达式匹配文本中的数字,并进行相应的数组操作和循环控制来实现。 3....

    迅雷网络公司 迅雷笔试题

    **题目描述:** 给定一个长度为10000的字符串,设计一个算法输出该字符串中出现次数最多的三个字符及其出现次数。 **知识点详解:** - **基本思路:** - 构建一个哈希表记录每个字符出现的频率。 - 对哈希表中的...

Global site tag (gtag.js) - Google Analytics