关于两个排列的思考

在学校的时候,记得我们的Java程序设计的考试题目是一道编程题,具体的说是满足如下条件的排列:

(1)1,2,2,3,4,5六个数的全排列;

(2)4不能出现在第三位;

(3)3和5不能相邻。

当初,我是用的字符串的操作来做的,结果好像不太合适,最近在CSDN上看到有人也做过。有句话说的好,“你有一个苹果,我有一个苹果,交换后我们每人还是一个苹果;你有一个思想,我有一个思想,交换后我们每人就有两个思想。”,可见交流的重要性,CSDN是个很好的平台,在上面能够跟来自天南地北的人交流,就上面所说的那个问题,很多人都发表了自己的想法,受益匪浅,下面就来分享出我个人的做法,欢迎大家指教!好了,废话不说了!下面就说说我的想法:

    第一步,做个1,2,3,4,5,6六个数的一个全排列。也就是6个数的全排列,总共有720个结果。这步里面有一个技巧,判断前一个数和后一个数是否相等,如果相等,则continue,这样能够减少循环的次数,提高效率。当然,在这步里,顺便考虑了除去了4在第三位的情况。这样就得到了600个数。把得到的结果放入一个TreeSet。

    第二步,从上面得到的结果集中取出3和5不相邻的,放入到一个新的TreeSet中,在放入前,用2替换掉里面的6。这样就得到了最后的结果,也就是198个满足条件的排列。

注意:上面用TreeSet有两个原因,一是可以过滤掉重复的值,二是可以给结果集排序,可以算是两全齐美吧!

下面就是我的程序,欢迎大家指正。

 

 

下面来说另一个,也是一个排列的,题目的大致意思是:有p、q、r三个数组,对应有0,1两个数字,就是通过给数组赋值(0和1)来打印出一个p、q、r的一个排列。这道题也是CSDN上有人问过的题,大家都爆出了自己的做法,有些直接是赋值做全排列,也有些yo用别的做法的。但是我但是就想到了另外一种做法,下面就说说我的想法。

学计算机的都知道,计算机内部采用的是二进制,所谓的二进制,就是说每个数只有0和1组成。基于这种思想,我就想着可以把题目做个等价变换,也就是说三位0或1构成的一个全排列,更进一步说,就是0-7的二进制表示形式。所以,我就写了下面的程序来实现这个过程。当然了,我的目的是和大家交流,欢迎大家指教。

下面是我的程序:

 

换个角度,换个思维,或许问题就更容易解决了!

山不过来,我就过去!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值