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

简介: 本文为原创,如需转载,请注明作者和出处,谢谢!     原题如下:用1、2、2、3、4、5这六个数字,用java写一个程序,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。

本文为原创,如需转载,请注明作者和出处,谢谢!

    原题如下:用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


142523


143225


143252


145223


145232


152234


152243


152324


152342


152423


152432


212345


212543


213245


213254


213425


213452


215234


215243


215423


215432


221345


221543


223145


223154


223415


223451


225134


225143


225413


225431


231245


231254


231425


231452


231524


231542


232145


232154


232415


232451


232514


232541


241325


241523


242315


242513


243125


243152


243215


243251


245123


245132


245213


245231


251234


251243


251324


251342


251423


251432


252134


252143


252314


252341


252413


252431


312245


312254


312425


312452


312524


312542


315224


315242


315422


321245


321254


321425


321452


321524


321542


322145


322154


322415


322451


322514


322541


325124


325142


325214


325241


325412


325421


341225


341252


341522


342125


342152


342215


342251


342512


342521


345122


345212


345221


412325


412523


413225


413252


415223


415232


421325


421523


422315


422513


423125


423152


423215


423251


425123


425132


425213


425231


431225


431252


431522


432125


432152


432215


432251


432512


432521


451223


451232


451322


452123


452132


452213


452231


452312


452321


512234


512243


512324


512342


512423


512432


513224


513242


513422


521234


521243


521324


521342


521423


521432


522134


522143


522314


522341


522413


522431


523124


523142


523214


523241


523412


523421


541223


541232


541322


542123


542132


542213


542231


542312


542321


543122


543212


543221


总数:198




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


123345


125433


132345


132543


133245


133254


133425


133452


143325


145233


152334


152343


152433


213345


215433


231345


231543


233145


233154


233415


233451


243315


245133


251334


251343


251433


312345


312543


313245


313254


313425


313452


315234


315243


315423


315432


321345


321543


323145


323154


323415


323451


325134


325143


325413


325431


331245


331254


331425


331452


331524


331542


332145


332154


332415


332451


332514


332541


341325


341523


342315


342513


343125


343152


343215


343251


345123


345132


345213


345231


413325


415233


423315


425133


431325


431523


432315


432513


433125


433152


433215


433251


451233


451323


451332


452133


452313


452331


512334


512343


512433


513234


513243


513324


513342


513423


513432


521334


521343


521433


523134


523143


523314


523341


523413


523431


541233


541323


541332


542133


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


目录
相关文章
|
20天前
|
缓存 算法 Java
Java 实现的局域网管控软件的性能调优
局域网管控软件在企业网络管理中至关重要,但随着网络规模扩大和功能需求增加,其性能可能受影响。文章分析了数据处理效率低下、网络通信延迟和资源占用过高等性能瓶颈,并提出了使用缓存、优化算法、NIO库及合理管理线程池等调优措施,最终通过性能测试验证了优化效果,显著提升了软件性能。
30 1
|
25天前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
62 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
3月前
|
负载均衡 NoSQL 算法
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
这篇文章是关于Java面试中Redis相关问题的笔记,包括Redis事务实现、集群方案、主从复制原理、CAP和BASE理论以及负载均衡算法和类型。
一天五道Java面试题----第十天(简述Redis事务实现--------->负载均衡算法、类型)
|
3月前
|
搜索推荐 算法 Java
手写快排:教你用Java写出高效排序算法!
快速排序(QuickSort)是经典的排序算法之一,基于分治思想,平均时间复杂度为O(n log n),广泛应用于各种场合。在这篇文章中,我们将手写一个Java版本的快速排序,从基础实现到优化策略,并逐步解析代码背后的逻辑。
129 1
|
27天前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
92 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
27天前
|
算法 Java Linux
java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解
这篇文章介绍了如何在Java中使用Graphics2D在图片上绘制文字,并实现自动换行的功能。
70 0
|
1月前
|
算法 Java 测试技术
数据结构 —— Java自定义代码实现顺序表,包含测试用例以及ArrayList的使用以及相关算法题
文章详细介绍了如何用Java自定义实现一个顺序表类,包括插入、删除、获取数据元素、求数据个数等功能,并对顺序表进行了测试,最后还提及了Java中自带的顺序表实现类ArrayList。
18 0
|
3月前
|
设计模式 缓存 算法
揭秘策略模式:如何用Java设计模式轻松切换算法?
【8月更文挑战第30天】设计模式是解决软件开发中特定问题的可重用方案。其中,策略模式是一种常用的行为型模式,允许在运行时选择算法行为。它通过定义一系列可互换的算法来封装具体的实现,使算法的变化与客户端分离。例如,在电商系统中,可以通过定义 `DiscountStrategy` 接口和多种折扣策略类(如 `FidelityDiscount`、`BulkDiscount` 和 `NoDiscount`),在运行时动态切换不同的折扣逻辑。这样,`ShoppingCart` 类无需关心具体折扣计算细节,只需设置不同的策略即可实现灵活的价格计算,符合开闭原则并提高代码的可维护性和扩展性。
62 2
|
3月前
|
安全 算法 Java
java系列之~~网络通信安全 非对称加密算法的介绍说明
这篇文章介绍了非对称加密算法,包括其定义、加密解密过程、数字签名功能,以及与对称加密算法的比较,并解释了非对称加密在网络安全中的应用,特别是在公钥基础设施和信任网络中的重要性。
|
3月前
|
数据采集 搜索推荐 算法
【高手进阶】Java排序算法:从零到精通——揭秘冒泡、快速、归并排序的原理与实战应用,让你的代码效率飙升!
【8月更文挑战第21天】Java排序算法是编程基础的重要部分,在算法设计与分析及实际开发中不可或缺。本文介绍内部排序算法,包括简单的冒泡排序及其逐步优化至高效的快速排序和稳定的归并排序,并提供了每种算法的Java实现示例。此外,还探讨了排序算法在电子商务、搜索引擎和数据分析等领域的广泛应用,帮助读者更好地理解和应用这些算法。
39 0