输出1,2,2,3,4,5的所有排列组合,4不能在第三位,3和5不能相邻

全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个。现以{1, 2, 3, 4, 5}为 全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个。现以{1, 2, 3, 4, 5}为 例说明如何编写全排列的递归算法。 1、首先看最后两个数4, 5。 它们的全排列为4 5和5 4, 即以4开头的5的全排列和以5开头的4的全排列。 由于一个数的全排列就是其本身,从而得到以上结果。 2、再看后三个数3, 4, 5。它们的全排列为3 4 5、3 5 4、 4 3 5、 4 5 3、 5 3 4、 5 4 3 六组数。 即以3开头的和4,5的全排列的组合、以4开头的和3,5的全排列的组合和以5开头的和3,4的全排列的组合. 从而可以推断,设一组数p = {r1, r2, r3, ... ,rn}, 全排列为perm(p),pn = p - {rn}。 因此perm(p) = r1perm(p1), r2perm(p2), r3perm(p3), ... , rnperm(pn)。当n = 1时perm(p} = r1。 为了更容易理解,将整组数中的所有的数分别与第一个数交换,这样就总是在处理后n-1个数的全排列。 立即下载

原文地址:http://www.java2000.net/viewthread.jsp?tid=6323

先看代码吧:

import java.util.ArrayList;

import java.util.List;
import java.util.Set;
import java.util.TreeSet;
/**
 * 
 * @author 赵学庆 www.java2000.net
 *
 */
public class T {
  public static List<String> find(List<String> list) {
    List<String> rtn = new ArrayList<String>();
    String str;
    for (int i = 0; i < list.size(); i++) {
      str = list.get(i);
      list.remove(i);
      if (list.size() == 0) {
        rtn.add(str);
      } else {
        List<String> sList = find(list);
        for (String s : sList) {
          rtn.add(str + s);
          if (s.length() == 5) {
            addNumber(str + s);
          }
        }
      }
      list.add(i, str);
    }
    return rtn;
  }

  public static void addNumber(String str) {
    if (str.charAt(2) == '4' || str.contains("35") || str.contains("53")) {
      return;
    }
    set.add(str);
  }

  public static Set<String> set = new TreeSet<String>();

  public static void main(String[] args) {
    List<String> list = new ArrayList<String>();
    list.add("1");
    list.add("2");
    list.add("2");
    list.add("3");
    list.add("4");
    list.add("5");
    find(list);
    System.out.println(set.size());
    int cols = 10;
    for (String s : set) {
      System.out.print(s+" ");
      if(cols--==1) {
        System.out.println();
        cols = 10;
      }
    }
  }
}

输出结果

198 
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 

网友提供的一个比较优化的算法

import java.util.Set;
import java.util.TreeSet
/**
 * 原始版本没有考虑重复问题,我进行了修正.<br>
 * 此算法的精华就是,让一个字符串的所有位置都进行互换,<br>
 * 这样就产生了所有可能出现的字符串。
 * 
 * @author 赵学庆,nicky_zs www.java2000.net
 */
public class MyTest {
  public static void main(String args[]) {
    char[] number = new char[] { '1', '2', '2', '3', '4', '5' };
    perm(number, 0, number.length - 1);
    System.out.println(set.size());
    int cols = 10;
    for (String s : set) {
      System.out.print(s + " ");
      if (cols-- == 1) {
        System.out.println();
        cols = 10;
      }
    }
  }
  public static void addNumber(String str) {
    set.add(str);
  }
  public static Set<String> set = new TreeSet<String>();
  public static void perm(char[] n, int beg, int end) {
    if (beg == end) {
      String result = String.valueOf(n);
      if (n[2] == '4')
        return;
      if (result.contains("35") || result.contains("53"))
        return;
      addNumber(String.valueOf(n));
      return;
    }
    for (int i = beg; i <= end; ++i) {
      swap(n, beg, i);
      perm(n, beg + 1, end);
      swap(n, beg, i);
    }
  }
  public static int number = 0;
  public static void swap(char[] n, int a, int b) {
    char temp = n[a];
    n[a] = n[b];
    n[b] = temp;
  }
}






<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
Java排列组合算法分析和代码实现 本资源附带文档解释了排列组合算法的实现和原理。其中排列算法是基于递归实现的,组合算法是基于高效的位移法实现的。代码是使用Java版实现的。 立即下载

相关推荐

Difftest踩坑笔记(一)

Difftest是差分测试框架,有什么用呢?高性能CPU的设计需要做复杂的测试,传统的测试方法运行较慢,而且出了问题很难定位,Difftest就是为了解决这两个问题。

http://www.icfgblog.com/ 4198

输出{1,2,2,3,4,5}排列组合,4不能在第三位,3和5不能相邻

package com.hello; import java.util.HashSet; import java.util.Set; /* * @author 张春蕾 * 输出1,2,2,3,4,5的所有排列组合,4不能在第三位,3和5不能相邻 * 本题目的解决时我自己的思路,不知道最总结果是否正确,若不正确请谅解 * 不使用循环递归,忘了是哪个公司的笔试题了 */ public c...

指尖岁月,“码”的人生 496

Voxel Hashing技术解析:如何解决TSDF内存爆炸问题?

本文深入解析Voxel Hashing技术如何有效解决TSDF内存爆炸问题。通过动态内存分配和空间哈希函数设计,该技术将内存占用降低96.6%,同时保持高精度重建。文章详细介绍了GPU加速实现、现代系统演进及实践指南,为实时3D重建提供工程解决方案。

m2n3b4v5c6的博客 715

java 排列3_【原创】【Java笔试】输出1,2,2,3,4,5的所有排列组合,4不能在第三位,3和5不能相邻...

import java.util.HashSet;import java.util.Set;public class MySort {public static void main(String[] args) {//我的微博 http://weibo.com/namenode 欢迎大家关注更多的Java笔试题//我的邮箱 342187233@qq.com也多多希望大家把见到的无论不会做的Java...

weixin_33195817的博客 373

labview中DAQ采集多个数据通道(温度传感器)(TTL信号的曲轴位置传感器)总结

文章目录前言一、面对的问题篇二、问题解决篇三、后续工作总结 前言 我研一的项目利用labview软件和NI数据采集卡采集发动机传感器的信号然后进行采集,发动机传感器是有很多种的,所以难以避免的需要采集多个通道的传感器信号。 一、面对的问题篇 前篇已经写道我已经将温度传感器的信号采集出来,也可以将其数据进行信号处理,由电压信号转变为温度值。但是想要采集多个通道的信号,加上TTL信号的曲轴位置传感器,我模仿温度传感器采集的程序另加了一个DAQ助手进行采集。也就是如图所示的程序: 但是这个程序不能正常显

xiaobaiwsc的博客 1万+

避坑指南:C#用S7NetPlus读写西门子PLC字符串(String/WString)的完整方案

本文详细解析了C#通过S7NetPlus读写西门子PLC字符串(String/WString)的完整方案,包括内存布局、编码差异和字节序处理等关键技术细节。提供了实战优化的代码示例和常见问题排查指南,帮助开发者避免乱码、截断等常见陷阱,提升工业自动化项目的开发效率。

weixin_32956805的博客 323

面试题:输出1,2,2,3,4,5的所有排列组合,4不能在第三位,3和5不能相邻

某一次面试时的上机题,准备较充分的情况下完成的代码。很久没写算法类的代码了,放上来仅做保留方便查看。package permutation; import java.util.Iterator; import java.util.TreeSet; /** * Permutation.class * @author vincent * 2007-07-28 */ public class

xinke7hao的专栏 927

Basilisk vs. STK:开源航天仿真工具在Windows上的实战体验与生态对比

本文对比了开源航天仿真工具Basilisk与商业软件STK在Windows平台上的实战体验与生态差异。从技术架构、安装配置、使用成本、功能覆盖、社区生态到适用场景,全面分析了二者的优劣势,为航天工程师和研究人员提供选型参考。Basilisk在性能和扩展性上表现突出,而STK在可视化与专业模块上更具优势。

weixin_30632089的博客 589
上一篇: yield(),sleep()以及wait()的区别(修正版)
下一篇: 一个针对初学者的自学顺序推荐
老紫竹
博客等级 码龄19年 1万+粉丝 1252原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值