122345 java_【每天算法2】:用java语言实现,一个组数:122345这6个数,打印出它所有可能的组合;要求4不能在第3位,3和5不能相连。...

本文介绍如何使用Java递归算法生成122345这6个数的所有可能组合,同时满足4不在第3位,3和5不相邻的条件。博主分享了自己的实现思路,并邀请读者提供更优算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个组数:122345这6个数,打印出它所有可能的组合;要求4不能在第3位,3和5不能相连。

我在实现这个算法的时候,按照len不固定的方式,利用递归方式进行处理。

感觉我的算法复杂度还是挺高的。过程中,不断的创建新的数组列别。

如果你有更好的算法,请发上来,可以好好学习下。

package com.sw.suanfa.first.ten;

import java.util.ArrayList;

import java.util.List;

/**

* 用java语言实现,一个组数:122345这6个数,打印出它所有可能的组合;要求4不能在第3位,3和5不能相连。

* 我的做法:首先,我确定用递归实现。

* 其次,不排除任何条件,打出所有的组合。

* 在递归中增加了preNum,和level参数,可方便的对条件【4不能在第3位,3和5不能相连】进行过滤。

* 在递归正增加了intList,便于排除重复。比如122345这个串中有2个2.则按照以上的算法会出现重复的情况。

* 这里用了一个intList主要是利用其方法indexOf,实际也可以通过数组循环的方式来查找,这里为了方便就用了list。

*

* @author songwei

* @date 2010.3.24

*

*/

public class ComposeArray {

public static void main(String[] args) {

int len = 6;

int[] numArray = {1,2,2,3,4,5};

int[] currentArray = new int[len];

getNextNumber(0,1,numArray,currentArray);

}

/**

*

* @param preNum 前一个数值

* @param level 当前层数

* @param numArray 当前层中能够选择的数值集合

* @param currentArray 正在操作的数组,当这个数组中的所有值均覆值后,则为条件允许情况下的一个数值集合。

*/

private static void getNextNumber(int preNum,int level,int[] numArray,int[] currentArray){

List intList = new ArrayList();

for(int i=0;i

int currentNum = numArray[i];

if(intList.indexOf(Integer.valueOf(currentNum))>-1) continue ;

intList.add(currentNum);

//4不能在第3位出现

if(level == 3 && currentNum == 4) continue ;

if(level != 1){

//3和5不能相连

if((currentNum ==5 && preNum == 3) || (currentNum ==3 && preNum == 5)){

continue ;

}

}

currentArray[level-1] = currentNum ;

int nextLevel = level +1 ;

if(level == currentArray.length){

OutArray(currentArray);

return ;

}else{

getNextNumber(currentNum,nextLevel,createNewArray(numArray,i),currentArray);

}

}

}

/**

* 创建一个新的数组,这个数组为该次排列中,下一个level可以出现的数值集合。

* @param oldArray

* @param orderNumber

* @return

*/

private static int[] createNewArray(int[] oldArray,int orderNumber){

if(oldArray.length<=1) return null ;

int newLen = oldArray.length-1 ;

int[] newArray =new int[newLen];

int newOrderNumber = 0 ;

for(int i=0;i

if(i == orderNumber) continue ;

newArray[newOrderNumber] = oldArray[i];

newOrderNumber ++ ;

}

return newArray;

}

private static void OutArray(int[] array){

for(int i=0;i

System.out.print(array[i]);

}

System.out.println("");

}

}

今天的任务又完成了。看明天了。刚找了一道题,看着比较麻烦,不知道明天能不能写出来!嘿

明天的题目:

有一个二维Vector,每个元都是字符串(或者其他对象),如下面这个三行,每行元素不固定的二维Vector  V。A、B、C、D

H、I、J、K、M

X、Y、Z求出满足以下条件的所有Vector D(一定是所有可能的情况):

1.此Vector D的元素包含V的所有元素,且每个元素仅出现一次

2. 此Vector D中包含在V[1]中的元素之间的顺序不能发生改变,即A、B、C、D之间的顺序不发生改变,同理,V[2]、V[3]。都不发生改变。对于本例,也就是说,在结果D中,A、B、C、D的先后顺序不变,H、I、J、K、M的先后顺序不变,X、Y、Z的先后顺序不变。结果D的几种可能的情况是:

1:A、B、C、D、H、I、J、K、M、X、Y、Z

2:H、I、A、B、C、X、D、J、K、Y、Z、M

3:A、H、I、X、Y、Z、B、C、J、K、M、D等等

随便找了一道,不仔细看了,好好工作了。明天再仔细观摩一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值