您的位置:首页 > 其它

一个简单的算法题

2010-05-31 17:09 309 查看
看了http://www.cnblogs.com/hya1109/archive/2008/02/18/1072671.html。感觉思路不对。
自己决定尝试一下。

原题:

该公司笔试题就1个,要求在10分钟内作完。

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

思路:

首先,我觉得就是用递归来解决全排列的问题。然后筛除不合条件的排列就可以了。

package algorithms;
import java.util.ArrayList;
public class Algorithms {
public static void main(String[] args){

int[] ints = {1,2,2,3,4,5};
String str = "";
allList(str,ints);
System.out.println("valid sequences============");
for(Object o : validList){
System.out.println(o);
}
System.out.println("invalid sequences============");
for(Object o : inValidList){
System.out.println(o);
}

}
static ArrayList validList = new ArrayList();
static ArrayList inValidList = new ArrayList();
static void allList(String str,int[] ints){

for(int i = 0; i< ints.length; i++){
if (ints.length == 1){
String s = str + ints[i];
if (isValid(s)){
validList.add(s);
}else {
inValidList.add(s);
}
return;

}
allList(str + ints[i],getInts(i,ints));
}

}

static int[] getInts(int i, int[] ints){
int[] newarr = new int[ints.length - 1];
for(int j = 0,k=0; j < ints.length; j++){
if(j!=i)newarr[k++]=ints[j];
}
return newarr;
}

static boolean isValid(String str){
if (str.contains("35") || str.contains("53") || str.indexOf("4") == 2){
return false;
}
return true;
}
}


又用Scala实现了一遍,做个对比:

package test
import scala.collection.mutable.ListBuffer
object HelloWorld {
def main(args: Array[String]){
allList("",List(1,2,2,3,4,5))
list foreach println
}
var list: ListBuffer[String] = new ListBuffer[String]
def allList(str: String, ints: List[Int]):Unit = ints match {
case head::Nil => {
def isValid(str:String) = !(str.contains("35")||str.contains("53")||str.indexOf("4")==2)
val result =  str+head
if(isValid(result))list += result

}
case _ => for(i <- 0 to ints.size-1){
allList(str+ints(i),subList(i,ints))
}

}

def subList(i: Int, lst: List[Int]):List[Int] = {
val sub = new ListBuffer[Int]
for (j <- 0 to lst.size - 1){
if(j!=i)sub += lst(j)
}
sub.toList
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: