Re: 一著名软件公司的java笔试算法题!

来源:互联网 发布:网络开店卖虚拟 编辑:程序博客网 时间:2024/04/28 02:49
主  题: Re: 一著名软件公司的java笔试算法题! 作  者:   szlhj () 等  级:   信 誉 值:   95 所属论坛:   Java J2SE / 基础类 问题点数:   20 回复次数:   167 发表时间:   2007-1-14 14:32:49    

原题如下:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连.
我看了回贴都没有很好解决,主要是没有排除重复。
解决思路:强化题目,用1、2、2、3、4、5这六个数字排列“递增”序列。其他要求不变。
算 法思路:显然是递归,初始序列122345,先从末两位(45)变化(45,54),然后末三位(345) ... 直到最后六位.怎样解决重复问题?很简单,由于是递增序列,每生成新序列可与前一生成序列比较,如<放弃当前序列。当然有更好效率,如预先预测。代 码如下:
class test
{
// 当前固定部分
private String CurFixPart;
private String PreGenNum;

public static void main(String[] args)
{
test t=new test();
t.GenControll("122345");
}

// 调整字符串s位置pos字符到最前
private String shift(String s, int pos)
{
String newStr;
if (s.length()>pos+1)
newStr=s.substring(pos, pos+1)
+s.substring(0, pos)
+s.substring(pos+1);
else
newStr=s.substring(pos)
+s.substring(0, pos);
return newStr;
}

protected int Validate(String newNum)
{
String newGenNum=CurFixPart+newNum;
if (Integer.valueOf(newGenNum)<=Integer.valueOf(PreGenNum))
return 0;
if (newGenNum.substring(2,3).equals("4") ||
(newGenNum.indexOf("35")!=-1) || (newGenNum.indexOf("53")!=-1))
return 0;

PreGenNum=newGenNum;
System.out.println(newGenNum);
return 0;
}

public void GenControll(String Base)
{
PreGenNum="0";
CurFixPart="";
GenNext(Base, 0);
}

void GenNext(String varPart, int curPos)
{
if (varPart.length()==2)
{
Validate(varPart);
Validate(shift(varPart, 1));
return;
}
// Next Layer
String newGen=shift(varPart, curPos);
String SavedFixPart=CurFixPart;
CurFixPart=CurFixPart+newGen.substring(0,1);
GenNext(newGen.substring(1), 0);
CurFixPart=SavedFixPart;
// 同层递增
if (curPos==varPart.length()-1)
return;
GenNext(varPart, curPos+1);
}
}
序列122345测试通过。
有什么意见请大家多多提点。


回复人:i5land() ( 一级(初级)) 信誉:100 2007-1-14 14:37:25 得分:0     ?

1 把问题归结为图结构的遍历问题。实际上6个数字就是六个结点,把六个结点连接成无向连通图,对于每一个结点求这个图形的遍历路径,所有结点的遍历路径就是最后对这6个数字的排列组合结果集。
2 显然这个结果集还未达到题目的要求。从以下几个方面考虑:
1. 3,5不能相连:实际要求这个连通图的结点3,5之间不能连通, 可在构造图结构时就满足改条件,然后再遍历图。
2. 不能有重复: 考虑到有两个2,明显会存在重复结果,可以把结果集放在TreeSet中过滤重复结果
3. 4不能在第三位: 仍旧在结果集中去除满足此条件的结果。

采用二维数组定义图结构,最后的代码是:

import java.util.Iterator;
import java.util.TreeSet;

public class TestQuestion {

private String[] b = new String[]{"1", "2", "2", "3", "4", "5"};
private int n = b.length;
private boolean[] visited = new boolean[n];
private int[][] a = new int[n][n];
private String result = "";
private TreeSet set = new TreeSet();

public static void main(String[] args) {
new TestQuestion().start();
}

private void start() {

// Initial the map a[][]
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == j) {
a[i][j] = 0;
} else {
a[i][j] = 1;
}
}
}

// 3 and 5 can not be the neighbor.
a[3][5] = 0;
a[5][3] = 0;

// Begin to depth search.
for (int i = 0; i < n; i++) {
this.depthFirstSearch(i);
}

// Print result treeset.
Iterator it = set.iterator();
while (it.hasNext()) {
String string = (String) it.next();
// "4" can not be the third position.
if (string.indexOf("4") != 2) {
System.out.println(string);
}
}
}

private void depthFirstSearch(int startIndex) {
visited[startIndex] = true;
result = result + b[startIndex];
if (result.length() == n) {
// Filt the duplicate value.
set.add(result);
}
for(int j = 0; j < n; j++) {
if (a[startIndex][j] == 1 && visited[j] == false) {
depthFirstSearch(j);
} else {
continue;
}
}

// restore the result value and visited value after listing a node.
result = result.substring(0, result.length() -1);
visited[startIndex] = false;
}
}
3,5不能相连:实际要求这个连通图的结点3,5之间不能连通, 可在构造图结构时就满足改条件,然后再遍历图。
代码中请注意这几行:
// 3 and 5 can not be the neighbor.
a[3][5] = 0;
a[5][3] = 0;

只要这样定义图,根本不用在代码中写IF ELSE语句。
实际上基于图的算法好处在于,只要你能定义好满足题目要求的图结构,遍历的结果就是你要的结果,不用任何对遍历结果做任何处理。包括本题中的:4不能在第三位置,3,5不能相连,唯一
性要求,其实都可以在体现在构造的图形结构里,然后直接遍历图取得自己要的结果。而不用再次处理结果集。

只是说这里实际上对其它要求要体现在图结构里有困难(理论上是可以的),但起码3,5不能相接是很好构造的,就是上面的代码段来解释的。

关于图形数据结构建议先看看数据结构的书,主要是将如何利用二维数组描述图结构,再看看图的深度遍历实现原理。最后再应用到这个问题上来,自然就不难明白了。

Top   回复人:szlhj() ( 一级(初级)) 信誉:95 2007-1-14 15:00:30 得分:0     ?

to i5land():
图虽然概念清晰,但用在这题上并不是很好
1。运行效率,没办法避免重复的排序。
2。内存,用TreeSet存结果集,如果序列很长,内存会耗光。
Top   回复人:For_suzhen(不懂装懂) ( 五级(中级)) 信誉:100 2007-1-14 15:16:05 得分:0     ?

学习一下啊,今天没时间了
Top   回复人:szlhj() ( 一级(初级)) 信誉:95 2007-1-14 16:25:36 得分:0     ?

补充:由于时间的关系,上面给的代码没有多做考虑。
其实有两方面可以优化一下:
1。Validate 可以学习Struts,利用抽象Validate集去掉If/Else语句。在此不多说。
2。在同层递增前增加“重复预测“减少不必要的重复排序,提高效率。
改进代码如下,其中“//********”处为修改地方
class test
{
// 当前固定部分
private String CurFixPart;
private String PreGenNum;

public static void main(String[] args)
{
test t=new test();
t.GenControll("1111111111");
}

// 调整字符串s位置pos字符到最前
private String shift(String s, int pos)
{
String newStr;
if (s.length()>pos+1)
newStr=s.substring(pos, pos+1)
+s.substring(0, pos)
+s.substring(pos+1);
else
newStr=s.substring(pos)
+s.substring(0, pos);
return newStr;
}

protected int Validate(String newNum)
{
String newGenNum=CurFixPart+newNum;

if (Integer.valueOf(newGenNum)<=Integer.valueOf(PreGenNum))
return 0;

if (newGenNum.substring(2,3).equals("4") ||
(newGenNum.indexOf("35")!=-1) || (newGenNum.indexOf("53")!=-1))
return 0;

PreGenNum=newGenNum;
System.out.println(newGenNum);
return 0;
}

public void GenControll(String Base)
{
PreGenNum="0";
CurFixPart="";
GenNext(Base, 0);
}

void GenNext(String varPart, int curPos)
{
if (varPart.length()==2)
{
Validate(varPart);
Validate(shift(varPart, 1));
return;
}
// Next Layer
String newGen=shift(varPart, curPos);
String SavedFixPart=CurFixPart;
CurFixPart=CurFixPart+newGen.substring(0,1);
GenNext(newGen.substring(1), 0);
CurFixPart=SavedFixPart;
//*************
// 同层递增
while (true)
{
if (curPos==varPart.length()-1)
break;
// 预测是否重复
curPos++;
if (Integer.valueOf(CurFixPart+shift(varPart, curPos))<=Integer.valueOf(PreGenNum))
continue;

GenNext(varPart, curPos);
break;
}
//*************
}
}
Top   回复人:JianZhiZG(健之) ( 二级(初级)) 信誉:100 2007-1-14 17:44:51 得分:0     ?

本来以为很简单,用递归一下就搞定的问题,结果 按照递归的常规思路,在打印的时候碰到了很麻烦的问题,费了我不少脑筋,结果答案还是很简单,弄得我做出来了过后都准备把结果放到博客商保存了。其实我做 的是字符串排列显示的问题,其中打印时的条件判断语句是根据楼主的特殊要求添加的,诸位参考:
import java.util.*;
public class test {
public static void main(String[] arg) {
Scanner r=new Scanner(System.in);
String s=r.nextLine();
Pailie(s,"");
}
static void Pailie(String s, String p) {
if(s.length()<1) {
String t=p+s;
if(t.charAt(2)!='4' && t.contains("35")==false)
System.out.println(t);
}
else {
for(int i=0; i<s.length(); i++) {
Pailie(s.substring(1),p+s.substring(0,1));
s=s.substring(1)+s.substring(0,1);
}
}
}
}
Top   回复人:JianZhiZG(健之) ( 二级(初级)) 信誉:100 2007-1-14 17:47:49 得分:0     ?

以下是输入字符串abc的运行结果:
abc(输入行)
abc
acb
bca
bac
cab
cba
以下是楼主题的运行结果:
12345(输入行)
12345
12534
12543
13245
13254
14523
14532
14253
14325
15234
15243
15342
15324
23145
23154
24513
24531
24153
24315
25134
25143
25341
25314
21345
21534
21543
34512
34521
34125
34152
34251
34215
31245
31254
31524
31542
32514
32541
32145
32154
45123
45132
45231
45213
45312
45321
41253
41325
41523
41532
42315
42513
42531
42153
43125
43152
43251
43215
51234
51243
51342
51324
52341
52314
52134
52143
53124
53142
53241
53214
54123
54132
54231
54213
54312
54321

Top   回复人:KRplusSRequalGOD(狂人+善人=神) ( 二级(初级)) 信誉:100 2007-1-14 18:36:10 得分:0     ?

可以参考一下:求N!全排列。
http://bbs.kaoyan.com/thread-1697273-1-2.html
比求1-6强多了


下面的地址也有提到上面的有关内容
http://community.csdn.net/Expert/topic/5201/5201506.xml?temp=.5158502
Top   回复人:szlhj() ( 一级(初级)) 信誉:95 2007-1-14 18:46:07 得分:0     ?

提醒一下,大家都没理解,其实这题难点是如何有效排除重复的排列。
JianZhiZG(健之) 你可以试一下1223,你的算法没有排除重复
Top   回复人:JianZhiZG(健之) ( 二级(初级)) 信誉:100 2007-1-14 19:44:30 得分:0     ?

当然,如果要消除重复,用递归的方法的问题是, 递归中不知道整体的信息,因此没有办法比较整体的串间是否有重复。如果不怕占用大量的内存资源,可以先存储所有的排列串,然后再一个个比较,删除重复的即 可,如下(仅仅示意,简单写,程序中应该还有些问题,特别在删除重复串时):
import java.util.*;
public class test {
static LinkedList list=new LinkedList();
public static void main(String[] arg) {
Scanner r=new Scanner(System.in);
String s=r.nextLine();
Pailie(s,"");
for(int i=0; i<list.size(); i++)
for(int j=i+1; j<list.size(); j++)
if(((String)list.get(i)).compareTo((String)list.get(j))==0)
list.remove(j);
for(int i=0; i<list.size(); i++)
System.out.println(list.get(i));
}
static void Pailie(String s,String p) {
if(s.length()<1) {
String n=new String(p);
list.add(n);
}
else {
for(int i=0; i<s.length(); i++) {
Pailie(s.substring(1),p+s.substring(0,1));//递归调用
s=s.substring(1)+s.substring(0,1);//循环移位
}
}
}
}
这样,你的结果就得到了:
1223(输入行)
1223
1232
1322
2231
2213
2312
2321
2123
2132
3122
3221
3212
否 则,则必须转化条件,让递归算法在程序中就能判断和剔出重复的情况。比如,对于只可能有两个字符重复的情况,所有重复的串的情况出现在两个紧邻的字符相同 的情况下,我们则可以修改递归显示条件为当没有两个相邻字符相同时发生(同样,这条件可能不对,但只是说明问题),程序如下:
import java.util.*;
public class test {
static LinkedList list=new LinkedList();
public static void main(String[] arg) {
Scanner r=new Scanner(System.in);
String s=r.nextLine();
Pailie(s,"");
}
static void Pailie(String s,String p) {
if(s.length()<1) System.out.println(p);
else {
for(int i=0; i<s.length(); i++) {
if(s.length()<2 || (s.charAt(0)!=s.charAt(1)))
Pailie(s.substring(1),p+s.substring(0,1));//递归调用
s=s.substring(1)+s.substring(0,1);//循环移位
}
}
}
}
运行结果为:
1223(输入行)
1232
1223
2312
2321
2123
2132
2231
2213
3212
3221

Top   回复人:szlhj() ( 一级(初级)) 信誉:95 2007-1-14 21:21:04 得分:0     ?

to JianZhiZG(健之):
我们算法原理一样,我只是增加
1。Validate 可以学习Struts,利用抽象Validate集去掉If/Else语句。
2。在同层递增前增加“重复预测“减少不必要的重复排序,提高效率。
所以代码变复杂,你试一下“11111111”,两算法时间空间差别很大,
不过这只是优化问题。
Top   回复人:survivortt() ( 一级(初级)) 信誉:100 2007-1-15 13:35:34 得分:0     ?

先排列1,2,3,4,5
再插入2,当插入点是2的邻位时,只插左边或只插右边
Top   回复人:txlfire(火TT) ( 一级(初级)) 信誉:100 2007-1-15 16:36:06 得分:0     ?

学习
Top   回复人:JianZhiZG(健之) ( 二级(初级)) 信誉:100 2007-1-15 18:14:07 得分:0     ?

对算法的最终改进,这次应该是比较完整的版本了吧。
思 路是这样的,对于任意一个串利用递归进行排列时,我们是循环串中的每个字符到第一个字符进行递归。如果串中字符出现重复的话,则重复的字符只可以利用递归 算法一次,即只要与前面相同的字符循环到第一个字符时不调用递归就可以避免重复,为此,我们只需要按如下方式修改算法:
import java.util.*;
public class test {
static int count=0;
public static void main(String[] arg) {
Scanner r=new Scanner(System.in);
String s=r.nextLine();
Pailie(s,"");
System.out.println("Total:"+count);
}
static void Pailie(String s,String p) {
if(s.length()<1) {
System.out.println(p);//字符串长度小于1,换行
count++;
}
else {
int index[]=new int[s.length()];
for(int i=0; i<s.length(); i++)//该循环将所有字符的第一次出现的位置记录在数组index中
index[i]=s.indexOf(s.charAt(i));
for(int i=0; i<s.length(); i++) {
if(i==index[i])//只有当循环数与第一次记录数相等时才递归,保证相同字符中的第一个调用
Pailie(s.substring(1),p+s.substring(0,1));//递归,打印其它字符
s=s.substring(1)+s.substring(0,1);//循环移位
}
}
}
}
这样,由于相同的字符只递归调用了一次,则避免了重复串的排列。下面是几个典型的运算结果:
2222222(输入。当串中的所有字符相同时,应该递归调用1次)
2222222
Total:1

122222(输入。当串中只有一个字符不同时,该字符应该循环所有不同位置)
122222
222221
222212
222122
221222
212222
Total:6

1223(输入。szlhj的例子)
1223
1232
1322
2231
2213
2312
2321
2123
2132
3122
3221
3212
Total:12

122345(输入。本题的要求,最后结果为360个,其它的我就不列出来了,大家可以自己测试)
122345
122354
122453
122435
122534
……
543221
543212
Total:360
Top   回复人:xk2y(爱纱....!) ( 一级(初级)) 信誉:100 2007-1-15 20:35:38 得分:0     ?

厉害```学习收藏!!
Top   回复人:WL21869551() ( 一级(初级)) 信誉:100 2007-1-15 21:05:06 得分:0     ?

谢谢楼主的好贴,收藏起来!
Top   回复人:bistar(I'm Marvin.) ( 二级(初级)) 信誉:99 2007-1-16 10:04:28 得分:0     ?

收下学习
Top   回复人:teacher1998(英语+asp.net+MsSQL) ( 一级(初级)) 信誉:100 2007-1-16 10:09:29 得分:0     ?

up
Top   回复人:kevin_yumin() ( 一级(初级)) 信誉:100 2007-1-16 10:15:30 得分:0     ?

收藏学习,UP
Top   回复人:jouny_63(BestPanda) ( 一级(初级)) 信誉:100 2007-1-16 13:02:20 得分:0     ?

up
Top   回复人:mdxk(一笑家园) ( 四级(中级)) 信誉:99 2007-1-16 14:20:19 得分:0     ?

mark
Top   回复人:atao1128(酸酸甜甜就是我) ( 一级(初级)) 信誉:100 2007-1-16 14:59:43 得分:0     ?

最小是122345,最大是543221

for(i=122345;i<=543221;i++)
if(第三位不能为四)
{
循环截取两位,如果不为'35'或'53'的都打印出来
}
Top   回复人:atao1128(酸酸甜甜就是我) ( 一级(初级)) 信誉:100 2007-1-16 15:09:30 得分:0     ?

最小是122345,最大是543221

for(i=122345;i<=543221;i++)
if(第三位不能为四)
{
循环截取1位,
if all in(1,2,2,3,4,5)
循环截取两位,
if <>'35' and <>'53'
print()

}
Top   回复人:luocong(静下心来读点书!) ( 一级(初级)) 信誉:100 2007-1-16 15:20:10 得分:0     ?

不懂Java,贴个C语言版的:

#include <stdio.h>

#define MAXN 6

int a[MAXN], o[MAXN], used[256] = { 0 }, count = 0;

void print()
{
int i;
for (i = 0; i < MAXN; ++i)
printf("%d", o[i]);
printf("/n");
}

void solve(const int depth)
{
int i;

for (i = 0; i < MAXN; ++i)
{
if (used[i] > 0)
{
--used[i];

if (
!(i + 1 == 4 && depth == 2) && // 4 at position 3
!(i + 1 == 3 && depth > 0 && o[depth - 1] == 5) && // 53
!(i + 1 == 5 && depth > 0 && o[depth - 1] == 3) // 35
)
{
o[depth] = i + 1;
if (MAXN - 1 == depth)
{
++count;
print();
}
else
solve(depth + 1);
}
else
{
i = i;
}

++used[i];
}
}
}

int main()
{
int i;

a[0] = 1;
a[1] = 2;
a[2] = 2;
a[3] = 3;
a[4] = 4;
a[5] = 5;

for (i = 0; i < MAXN; ++i)
++used[a[i] - 1];

solve(0);
printf("Total count: %d/n", count);

return 0;
}

运行结果:

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
Total count: 198
Top   回复人:luocong(静下心来读点书!) ( 一级(初级)) 信誉:100 2007-1-16 15:22:58 得分:0     ?

寒,空格被吃了,第一次发贴。-_-|||
Top   回复人:renzaijiang() ( 一级(初级)) 信誉:100 2007-1-16 15:35:00 得分:0     ?

同意楼上的作法 c处理数学问题还是有他很大的优势的
Top   回复人:luocong(静下心来读点书!) ( 一级(初级)) 信誉:100 2007-1-16 15:36:58 得分:0     ?

全排列判重用不着记录之前的结果,而只需要先记录下每个字符出现的次数,然后在使用前减1,使用后加1,即可。
Top   回复人:hxDreamer(IDreamer) ( 一级(初级)) 信誉:98 2007-1-16 15:51:57 得分:0     ?

天呐,我什么时候才能做出来这种题,我都大一了。。。哎
Top   回复人:wyzchn(阿飞) ( 一级(初级)) 信誉:98 2007-1-16 16:14:37 得分:0     ?

这种有逻辑难度的问题真是让人喜欢,希望以后能经常碰到这种问题!
我写了一个,大家看看。

public class Test{
String s = "22";
String sc[] = {"22"};
int ii = 0;
public void doAdd(String ss){
String sc1[] = new String[sc.length*(sc[0].length()+1)];;
for(int i=0;i<sc.length;i++){
String s = sc[i];
String sc2[] = getStrArray(s,ss);
for(int j=0;j<sc2.length;j++){
sc1[i*sc2.length+j] = sc2[j];
}
}
sc = sc1;
}
public String[] getStrArray(String s,String ss){
String newSc[] = new String[s.length()+1];
for(int i=0;i<=s.length();i++){
String s1 = s.substring(0,i);
String s2 = s.substring(i);
newSc[i] = s1+ss+s2;
}
return newSc;
}
public Test(){
for(int i=3;i<6;i++){
doAdd(i+"");
}
doAdd(1+"");
}
public static void main(String arg[]){
Test t = new Test();
int j = 0;
for(int i=0;i<t.sc.length;i++){
String s = t.sc[i];
if(!(s.indexOf("35")>-1||s.indexOf("53")>-1||s.indexOf("4")==2)){
System.out.println(" 打印 S :"+s);
j++;
}
}
System.out.println(" 符合条件的数共有:"+j+"个");

}
}
Top   回复人:sxz7728() ( 一级(初级)) 信誉:100 2007-1-16 18:58:06 得分:0     ?

#include "stdafx.h"
#include <vector>
#include <iostream>

using namespace std;

ostream& operator << (ostream& os, vector<int>& v)
{
for(vector<int>::iterator i = v.begin(); i != v.end(); ++i)
{
cout << *(i) << " ";
}

return os;
}

bool CanPrint(const vector<int>& position)
{
if(position[4] == 2)
{
return false;
}
else if(position[3] - position[5] == 1 || position[3] - position[5] == -1)
{
return false;
}
else if(position[1] > position[2])
{
return false;
}
else
{
return true;
}
}

void Print(const vector<int>& position, const vector<int>& value)
{
static unsigned n = 0;

if(CanPrint(position))
{
++n;
vector<int> out(position.size());

for(unsigned i = 0; i < out.size(); ++i)
{
out[position[i]] = value[i];
}

cout << n << ":" << out << endl;
}
}

vector<int> SwapItem(int i, int j, const vector<int>& position)
{
vector<int> result = position;
int temp = result[i];
result[i] = result[j];
result[j] = temp;
return result;
}

void Calculate(unsigned depth, const vector<int>& position, const vector<int>& value)
{
Print(position, value);

for(unsigned i = depth; i < position.size() - 1; ++i)
{
for(unsigned j = i + 1; j < position.size(); ++j)
{
Calculate(i + 1, SwapItem(i, j, position), value);
}
}
}

void main(void)
{
vector<int> position(6);
vector<int> value(6);

position[0] = 0;
position[1] = 1;
position[2] = 2;
position[3] = 3;
position[4] = 4;
position[5] = 5;

value[0] = 1;
value[1] = 2;
value[2] = 2;
value[3] = 3;
value[4] = 4;
value[5] = 5;

Calculate(0, position, value);
}
Top   回复人:szlhj() ( 一级(初级)) 信誉:95 2007-1-16 19:11:09 得分:0     ?

真奇怪,写算法怎会根据某数据写,除非是为了骗只看结果的面试官。CSDN上很多算法的帖子都有这样的问题。
Top   回复人:SmartTony() ( 一级(初级)) 信誉:100 2007-1-16 19:46:17 得分:0     ?

baidu在线考试题,在线等……
1, 一个文本文件有多行,每行为一个URL。请编写代码,统计出URL中的文件名及出现次数。
a) 文件名不包括域名、路径和URL参数,例如http://www.rs.com/n.op/q/rs?id=1中的文件名是rs。
b) 部分URL可能没有文件名,例如http://www.abc.com/,这类统计为“空文件名”。
c) 出现在不同URL中的相同文件名视为同一文件名,例如http://www.ceshi.com/hi.php
和ftp://ftp.cdef.com/hi.php为同一文件名

文件内容示例如下:
http://www.test.com/abc/de/fg.php?id=1&url=http://www.test.com/index.html
http://www.ceshi.com/hi.jsp
ftp://ftp.ceshi.com/hi.jsp
http://www.hello.com/cw/hi.jsp?k=8
http://www.hi.com/jk/l.html?id=1&s=a.html
http://www.rs.com/n.op/q/rs?id=1
http://www.abc.com/

Top   回复人:Richard_Hong(武昌鱼) ( 一级(初级)) 信誉:100 2007-1-16 20:13:16 得分:0     ?

标记,以后再看!
Top   回复人:Elmer(渔村夕照) ( 二级(初级)) 信誉:100 2007-1-16 20:31:45 得分:0     ?

Mark
Top   回复人:dovelee(黑土) ( 一级(初级)) 信誉:100 2007-1-16 20:40:57 得分:0     ?

mark
Top   回复人:yunbaixingxing() ( 一级(初级)) 信誉:99 2007-1-16 21:16:25 得分:0     ?

马克
Top   回复人:DonBenBen() ( 一级(初级)) 信誉:100 2007-1-16 22:13:36 得分:0     ?

佩服~标记~
Top   回复人:swswssw(不停地学习...) ( 一级(初级)) 信誉:100 2007-1-16 22:23:51 得分:0     ?

高手做题,低手接分


.........顺便mark =_=!!
Top   回复人:handsome0308() ( 一级(初级)) 信誉:100 2007-1-17 8:34:30 得分:0     ?

mark
Top   回复人:madsun(迈得生) ( 一级(初级)) 信誉:99 2007-1-17 9:17:31 得分:0     ?

提供一个思路:
for(int i=0;i<6;i++)
for(int j=i+;i<6;j++){
// i, j 位置调换
1. String = changePosition(String, i,j);
//if 判断不成立的两种情况
2.截取第三位不为 "3"
3.判断不含"35", "53"
else
print(String);

}
}

Top   回复人:friday5pm() ( 一级(初级)) 信誉:100 2007-1-17 9:57:47 得分:0     ?

mark
Top   回复人:madsun(迈得生) ( 一级(初级)) 信誉:99 2007-1-17 10:05:14 得分:0     ?

提供一个思路:
for(int i=0;i<6;i++)
for(int j=i+1;i<6;j++){
// i, j 位置调换
1. String = changePosition(String, i,j);
//if 判断不成立的两种情况
2.截取第三位不为 "3"
3.判断不含"35", "53"
print(String);

}
}


Top   回复人:CloudsToCode2() ( 一级(初级)) 信誉:100 2007-1-17 10:46:49 得分:0     ?

很好的解题思路,谢谢各位的讨论
Top   回复人:zhm_gc() ( 一级(初级)) 信誉:100 2007-1-17 11:36:21 得分:0     ?

第一次在这里发贴就问声好吧!
这道题就是一个思想的问题其实方法也都差不多!
Top   回复人:wildwolfk(飞翔的胖鸟) ( 一级(初级)) 信誉:100 2007-1-17 13:20:44 得分:0     ?

虽然我对语言才只是菜鸟
但从看上
个人觉得 survivortt() 的思路很与众不同 有创意
他说:

先排列1,2,3,4,5
再插入2,当插入点是2的邻位时,只插左边或只插右边

在以上结果中排除要求的两个条件会比较方便吧 多两个IF而已
Top   回复人:karts(karts) ( 一级(初级)) 信誉:100 2007-1-17 15:24:32 得分:0     ?

来一个通用一点的方法。

#include <stdio.h>

void seq(int* digit, int num, int* outDigit, int outNum, int& total) {
int i, j, m;
int* digit2;
int num2;

if(num <= 0)
return;

num2 = num - 1;
digit2 = new int[num2];
for(i = 0; i < num; i++) {
//judge condition, and print result
if(outNum == 2 && digit[i] == 4)
continue;
if(digit[i] == 5 && outNum > 0 && outDigit[outNum - 1] == 3)
continue;
if(digit[i] == 3 && outNum > 0 && outDigit[outNum - 1] == 5)
continue;
if(outDigit[outNum] == digit[i])
continue;

outDigit[outNum] = digit[i];
if(num == 1) {
//out the resutl
for(j = 0; j < outNum + 1; j++)
printf("%d", outDigit[j]);
printf("/n");
total++;
}
else {
m = 0;
for(j = 0; j < num; j++) {
if(j != i)
digit2[m++] = digit[j];
}

seq(digit2, num2, outDigit, outNum + 1, total);
}
}
delete[] digit2;

outDigit[outNum] = 0;

}

void main()
{
int num;
int digit[1024] = {0};
int outDigit[1024] = {0};
int outNum = 0;
int total = 0;
int digitSeq = 0;

//init digit sequence
scanf("%d", &digitSeq);
num = 0;
while(digitSeq) {
digit[num++] = digitSeq % 10;
digitSeq /= 10;
}
printf("/nthe result is:/n");
//calc
seq(digit, num, outDigit, outNum, total);

printf("total=%d/n", total);
}

Top   回复人:calvin_wyx() ( 一级(初级)) 信誉:93 2007-1-17 16:58:03 得分:0     ?

mark! study!
Top   回复人:jianghu77(江湖) ( 一级(初级)) 信誉:100 2007-1-17 17:20:55 得分:0     ?


Top   回复人:chenminghong(cmh) ( 一级(初级)) 信誉:100 2007-1-17 17:28:02 得分:0     ?

初始值为:122345
然后用类似冒泡排序,进行求出所以排序可能的值。
再排除:"4"不能在第三位。
最后用POS排除,"3"与"5"不能相连.
本人对算法不是很了解
不知道这样做效率怎样?

Top   回复人:glassesboy(glassesboy) ( 一级(初级)) 信誉:100 2007-1-17 17:29:10 得分:0     ?

mark
Top   回复人:mashi8570(乐土) ( 一级(初级)) 信誉:100 2007-1-17 17:46:08 得分:0     ?

不服高人有罪!!!!!!
学习 all
Top   回复人:Man1982(Man1982) ( 一级(初级)) 信誉:100 2007-1-17 21:35:02 得分:0     ?

菜鸟收藏学习下,谢谢提供
Top   回复人:iambic() ( 三级(初级)) 信誉:100 2007-1-17 21:38:22 得分:0     ?

好无聊的题。
Top   回复人:mytherf() ( 一级(初级)) 信誉:100 2007-1-18 16:00:29 得分:0     ?

public static void main(String[] args) {
String[] num = { "1", "2", "2", "3", "4", "5" };
int total = 0;
for (int i = 0; i < num.length; i++) {
for (int j = 0; j < num.length; j++) {
if (j != i) {
for (int h = 0; h < num.length; h++) {
if (h != i && h != j) {
for (int k = 0; k < num.length; k++) {
if (k != i && k != j && k != h) {
for (int m = 0; m < num.length; m++) {
if (m != i && m != j && m != h&& m != k) {
for (int n = 0; n < num.length; n++) {
if (n != i && n != j && n != h&& n != k && n != m) {
System.out.println(num[i]+ num[j] + num[h]+ num[k] + num[m]+ num[n]);
total++;
}
}
}
}
}
}
}
}
}
}
}
System.out.println("total number=" + total);
}

........
543122
543212
543221
543212
543221
total number=720
Top   回复人:gjianpro(#ifndef _DEBUG) ( 一级(初级)) 信誉:100 2007-1-22 21:42:52 得分:0     ?

mark
Top   回复人:kukuxiaolang(酷酷小狼) ( 一级(初级)) 信誉:100 2007-1-23 11:41:31 得分:0     ?

mark
Top   回复人:vulcanus760226() ( 一级(初级)) 信誉:100 2007-1-23 17:00:28 得分:0     ?

标准答案是198个才对,360个是否还有重复?
Top   回复人:heimaoxiaozi(小木公子) ( 一级(初级)) 信誉:100 2007-1-23 17:31:59 得分:0     ?

blog 更新:
think in java 各章后练习答案.....
http://blog.csdn.net/heimaoxiaozi/
Top   回复人:JianZhiZG(健之) ( 二级(初级)) 信誉:100 2007-1-23 18:09:41 得分:0     ?

回vulcanus760226() :360个是543221的全排列,没有剔除原题要求的另外两种情况。只要把无重复全排列找到了,那只是一个简单的条件语句的问题,就简单了。
Top   回复人:m0317045() ( 一级(初级)) 信誉:100 2007-1-23 19:52:12 得分:0     ?

晕,就这么一道题目至于这么夸张么,简单.
public class Anagram {

/**
* @param args
*/
public static void main(String[] args) {
String word="éé23eRf@";
anagram("",word);
}
public static void anagram(String prefix, String suffix) {
String newPrefix,newSuffix;
int numOfChars=suffix.length();
if(numOfChars==1) {
if(!(prefix+suffix).contains("éé")&&(prefix+suffix).indexOf('@')!=2)
{
System.out.println(prefix + suffix);
}
} else {
for(int i=1;i<=numOfChars;i++) {
newSuffix=suffix.substring(1,numOfChars);
newPrefix=prefix+suffix.charAt(0);
anagram(newPrefix, newSuffix);
suffix=newSuffix+suffix.charAt(0);
}
}
}
}

Top   回复人:giles_zhu() ( 一级(初级)) 信誉:100 2007-1-25 11:33:40 得分:0     ?

楼上的能不能解释一下,你个这个算法看得我很迷糊!~~~
Top   回复人:soaroc(会飞的猪) ( 二级(初级)) 信誉:100 2007-1-25 14:07:46 得分:0     ?

mark

Top   回复人:Newpai(一滴水) ( 一级(初级)) 信誉:100 2007-1-25 14:14:52 得分:0     ?

我也来一个

for(int i=122345;i<543221;i++) {
if(contains(0,6,7,8,9,35)) continue;
if(2的个数 != 2)continue;
if(4的位数 = 3) continue;
println(i);
}
Top   回复人:Newpai(一滴水) ( 一级(初级)) 信誉:100 2007-1-25 14:27:34 得分:0     ?

修改一下

for(int i=122345;i<=543221;i++) {
if(contains(0,6,7,8,9,35)) continue;
if(contains(1,2,3,4,5)) continue;
if(2的个数 != 2)continue;
if(4的位数 = 3) continue;
println(i);
}

Top   回复人:jetmate() ( 一级(初级)) 信誉:100 2007-1-25 14:45:31 得分:0     ?

强人
Top   回复人:savitri() ( 一级(初级)) 信誉:100 2007-1-25 15:02:58 得分:0     ?

来学习一下强人。。。。。
Top   回复人:sanmuice() ( 一级(初级)) 信誉:100 2007-1-25 15:19:05 得分:0     ?

迷糊...顶哈清醒
Top   回复人:mb459() ( 一级(初级)) 信誉:100 2007-1-25 18:21:06 得分:0     ?

mark,回家了想想
Top   回复人:m0317045() ( 一级(初级)) 信誉:100 2007-1-25 18:40:30 得分:0     ?

提示:
比如一个字符串: cat
经变换得到atc然后到tac(就是把后面字母提到前面).
同理cat--cta
tac---tca, atc--act.
然后操作特例情况,比如哪些字母不能在一起.......
建议: 不要看到数字就往数学方面想,(大的工程,用数学公式除外)
象这样小的问题,往往跟数学分开比较简单.


Top   回复人:m0317045() ( 一级(初级)) 信誉:100 2007-1-25 18:47:58 得分:0     ?

newSuffix=suffix.substring(1,numOfChars);
newPrefix=prefix+suffix.charAt(0);
anagram(newPrefix, newSuffix);
suffix=newSuffix+suffix.charAt(0);
这就是把字母交换位置操作,交换完了,然后在递归到下一步.
Top   回复人:happy8888(黑皮) ( 一级(初级)) 信誉:100 2007-1-25 23:19:22 得分:0     ?

Mark!!
Top   回复人:ElfenLied() ( 一级(初级)) 信誉:100 2007-1-26 0:42:00 得分:0     ?

Newpai() 这个方法确实 不错
for(int i=122345;i<=543221;i++) {
if(contains(0,6,7,8,9,35)) continue;
if(contains(1,2,3,4,5)) continue;
if(2的个数 != 2)continue;
if(4的位数 = 3) continue;
println(i);
}
Top   回复人:mebio(临界思考) ( 二级(初级)) 信誉:100 2007-1-26 9:04:57 得分:0     ?

mark了
Top   回复人:kinsey0514(春天的老黄牛) ( 五级(中级)) 信誉:100 2007-1-29 9:13:37 得分:0     ?

做记号
Top   回复人:gengxin_914(星星) ( 一级(初级)) 信誉:100 2007-1-29 9:22:07 得分:0     ?

mark!
Top   回复人:Richard_Hong(武昌鱼) ( 一级(初级)) 信誉:100 2007-1-29 9:27:03 得分:0     ?

mark
Top   回复人:ak_2005(把你的影子 / 腌起来 / 风干 / 老的时候 / 下酒) ( 二级(初级)) 信誉:100 2007-1-29 9:31:32 得分:0     ?

mark
Top   回复人:mooniscrazy(月色疯狂) ( 一级(初级)) 信誉:100 2007-1-29 11:34:06 得分:0     ?

排列组合没学好。高中知识不过关。
1345进行全排列,然后从1345周围的5个空位中选出两个放入2,这样就得出了所有的全排列。
然后在打印时,遇到不符合条件的,就不予打印。

Top   回复人:dongfangbai(才微易向风尘老,身贱难酬知己恩!) ( 一级(初级)) 信誉:100 2007-1-29 13:40:35 得分:0     ?

nark

Top   回复人:mingyuan1983(日子指间沙) ( 二级(初级)) 信誉:100 2007-1-29 13:50:49 得分:0     ?

Mark
Top   回复人:szuzsq(兮) ( 四级(中级)) 信誉:100 2007-1-29 14:21:34 得分:0     ?

^
Top   回复人:wenbin0727() ( 一级(初级)) 信誉:100 2007-1-29 14:29:37 得分:0     ?

Newpai() ( ) 信誉:100
for(int i=122345;i<=543221;i++) {
if(contains(0,6,7,8,9,35)) continue;
if(contains(1,2,3,4,5)) continue;
if(2的个数 != 2)continue;
if(4的位数 = 3) continue;
println(i);
}
的算法有问题,有很多种情况没考虑到,132453,132553,154432...这样的数满足要求吗?





Top   回复人:wenbin0727() ( 一级(初级)) 信誉:100 2007-1-29 14:40:22 得分:0     ?

没有排除掉重复问题
Top   回复人:shareyao() ( 一级(初级)) 信誉:100 2007-1-29 14:48:07 得分:0     ?

mark!!xuexi!
Top   回复人:feifeimao520(飞飞猫) ( 一级(初级)) 信誉:100 2007-1-29 14:52:04 得分:0     ?

看看把
Top   回复人:mygia(www.gzcost.com) ( 四级(中级)) 信誉:100 2007-1-29 15:19:04 得分:0     ?

好铁,要顶
Top   回复人:xinguilee() ( 一级(初级)) 信誉:100 2007-1-29 15:39:17 得分:0     ?

mark
Top   回复人:hc_yao(木头) ( 一级(初级)) 信誉:98 2007-1-29 19:15:12 得分:0     ?

好久没有写算法程序了,都有些生疏了,呵呵。
package com.lily.test;

public class Test
{
private void arrange(int pos, int[] seed, int[] result, int preData)
{
if(pos >= result.length)
{
sum++;
print(result);
return;
}

for(int i = 0; i < seed.length; i++)
{
int curValue = seed[i];
if(i >= 1 && curValue == seed[i - 1])continue;
if(pos == 2 && curValue == 4)continue;
if(preData * curValue == 15)continue;
result[pos] = curValue;
int[] newSeed = new int[seed.length - 1];
copyArray(newSeed, seed, i);
arrange(pos + 1, newSeed, result, curValue);
}
}

private void copyArray(int[] dest, int[] source, int eliminatePos)
{
int n = 0;
for(int i = 0; i < source.length; i++)
{
if(i == eliminatePos)continue;
dest[n++] = source[i];
}
}

private void print(int[] result)
{
for(int i = 0; i < result.length; i++)
{
System.out.print(result[i]);
if(i != result.length - 1)
{
System.out.print(',');
}
}
System.out.println();
}

int sum;

public static void main(String[] args)
{
int[] seed = new int[]
{1, 2, 2, 3, 4, 5}; // 如果没有排序,请先排序
int[] result = new int[6];
Test test = new Test();
test.arrange(0, seed, result, -1);
System.out.println("Total:" + test.sum);
}
}
Top   回复人:m0317045() ( 一级(初级)) 信誉:100 2007-1-29 19:37:21 得分:0     ?

呵呵,如果不是数字呢?
比如 @|##|}]&acute;[[
:)
Top   回复人:onkyo1(onkyo1) ( 一级(初级)) 信誉:100 2007-1-29 20:48:21 得分:0     ?

我来提个思路。

1. 先对1,2,2,3,4,5 全排序。 把结果存到一个数组里面去。
数组的元素是一个string. 比如 122345, 522413 等等
2. 历遍整个数组用正规表达式去判断这个元素是不是符合规格
比如 122435
规则1 。 match=[//d][//d][//d][4]
规则2。 match=[35]|[53]
如果正规表达式匹配的结果数大于0, 说明这个元素不是我们要得
当匹配的结果等于0,则把这个元素加入一个新的集合中去
3. 新的集合就是我们要得结果集

好处: 1不要动脑子想,思路清楚。 2对于数字,字符,都适合。 3。规则的修改快速,比如要求改为第4位不能为1, 2和3不能相邻等, 只学要改规则就可以了。

Top   回复人:cc4512() ( 一级(初级)) 信誉:100 2007-1-30 7:38:41 得分:0     ?

mark
Top   回复人:finalcreator() ( 一级(初级)) 信誉:100 2007-1-30 10:49:34 得分:0     ?

............................unmark
Top   回复人:luffywang(卖身) ( 一级(初级)) 信誉:100 2007-1-30 13:22:01 得分:0     ?

收藏之
Top   回复人:cymandhxl(迷失中) ( 一级(初级)) 信誉:100 2007-1-30 15:04:22 得分:0     ?

好久没有写这些了,不过还记得思路。
使用回溯法,打印全排列,遇到不满足条件的剪枝。
这些在数据结构中都清楚地写着。
Top   回复人:wesuperone() ( 一级(初级)) 信誉:100 2007-1-30 22:03:14 得分:0     ?

mark
Top   回复人:xunmi12() ( 一级(初级)) 信誉:100 2007-1-31 12:22:30 得分:0     ?

JianZhiZG(健之) 代码还少了点东西 你这么输出没有排除35和4的几种情况

加个if吧
if(p.contains("35")==false && p.contains("53")==false && p.charAt(2)!=('4')){
System.out.println(p);//字符串长度小于1,换行
count++;
}

这样你的结果正好198 该是正确答案了

Top   回复人:eidewood() ( 一级(初级)) 信誉:100 2007-2-2 18:50:57 得分:0     ?

JAVA里面提供泛型算法,对12345做排列,然后写一个函数, 如果35连在一起,中间插2,如果4在第3位,在4的左边插2。

数据结构可以用Vector来做。
Top   回复人:Sandy945(阿非) ( 一级(初级)) 信誉:100 2007-2-2 20:02:07 得分:0     ?

mark

Top   回复人:blh(缴纳着北欧标准的税,享受着中非标准的福利) ( 二级(初级)) 信誉:100 2007-2-2 23:32:05 得分:0     ?

一个笨解法 :)
public class Test {
public static void main(String[] args) {
for (int a = 1; a < 7; a++) {
for (int b = 1; b < 7; b++) {
if (b == a) continue;
if ((b == 3) && (a == 5)) continue;
if ((b == 5) && (a == 3)) continue;
for (int c = 1; c < 7; c++) {
if (c == a) continue;
if (b == c) continue;
if (c == 4) continue;
if ((b == 3) && (c == 5)) continue;
if ((b == 5) && (c == 3)) continue;
for (int d = 1; d < 7; d++) {
if (d == a) continue;
if (b == d) continue;
if (c == d) continue;
if ((d == 3) && (c == 5)) continue;
if ((d == 5) && (c == 3)) continue;
for (int e = 1; e < 7; e++) {
if (e == a) continue;
if (b == e) continue;
if (c == e) continue;
if (e == d) continue;
if ((d == 3) && (e == 5)) continue;
if ((d == 5) && (e == 3)) continue;
for (int f = 1; f < 7; f++) {
if (f == a) continue;
if (b == f) continue;
if (c == f) continue;
if (e == f) continue;
if (f == d) continue;
if ((d == 3) && (f == 5)) continue;
if ((d == 5) && (f == 3)) continue;
String r = "" + a + b + c + d + e + f;
r = r.replace('6', '2');
System.out.println(r);
}
}
}
}
}
}

}

}

Top   回复人:blh(缴纳着北欧标准的税,享受着中非标准的福利) ( 二级(初级)) 信誉:100 2007-2-2 23:33:40 得分:0     ?

???
public class Test {
public static void main(String[] args) {
for (int a = 1; a < 7; a++) {
for (int b = 1; b < 7; b++) {
if (b == a) continue;
if ((b == 3) && (a == 5)) continue;
if ((b == 5) && (a == 3)) continue;
for (int c = 1; c < 7; c++) {
if (c == a) continue;
if (b == c) continue;
if (c == 4) continue;
if ((b == 3) && (c == 5)) continue;
if ((b == 5) && (c == 3)) continue;
for (int d = 1; d < 7; d++) {
if (d == a) continue;
if (b == d) continue;
if (c == d) continue;
if ((d == 3) && (c == 5)) continue;
if ((d == 5) && (c == 3)) continue;
for (int e = 1; e < 7; e++) {
if (e == a) continue;
if (b == e) continue;
if (c == e) continue;
if (e == d) continue;
if ((d == 3) && (e == 5)) continue;
if ((d == 5) && (e == 3)) continue;
for (int f = 1; f < 7; f++) {
if (f == a) continue;
if (b == f) continue;
if (c == f) continue;
if (e == f) continue;
if (f == d) continue;
if ((d == 3) && (f == 5)) continue;
if ((d == 5) && (f == 3)) continue;
String r = "" + a + b + c + d + e + f;
r = r.replace('6', '2');
System.out.println(r);
}
}
}
}
}
}
}
}

Top   回复人:blh(缴纳着北欧标准的税,享受着中非标准的福利) ( 二级(初级)) 信誉:100 2007-2-2 23:34:22 得分:0     ?

A:
123452
123425
123245
123254
125432
125423
125234
125243
122435
122453
132452
132425
132542
132524
132245
132254
132245
132254
132425
132452
132524
132542
142235
142253
143252
143225
143225
143252
145232
145223
145223
145232
142235
142253
152342
152324
152432
152423
152234
152243
152234
152243
152324
152342
152423
152432
122435
122453
123245
123254
123425
123452
125234
125243
125423
125432
213452
213425
213245
213254
215432
215423
215234
215243
212435
212453
231452
231425
231542
231524
231245
231254
232145
232154
232415
232451
232514
232541
241235
241253
243152
243125
243215
243251
245132
245123
245213
245231
242135
242153
251342
251324
251432
251423
251234
251243
252134
252143
252314
252341
252413
252431
221435
221453
223145
223154
223415
223451
225134
225143
225413
225431
312452
312425
312542
312524
312245
312254
315242
315224
315422
315422
315224
315242
312245
312254
312425
312452
312524
312542
321452
321425
321542
321524
321245
321254
325142
325124
325412
325421
325214
325241
322145
322154
322415
322451
322514
322541
341252
341225
341522
341522
341225
341252
342152
342125
342512
342521
342215
342251
345122
345122
345212
345221
345212
345221
342125
342152
342215
342251
342512
342521
321245
321254
321425
321452
321524
321542
322145
322154
322415
322451
322514
322541
325124
325142
325214
325241
325412
325421
412235
412253
413252
413225
413225
413252
415232
415223
415223
415232
412235
412253
421235
421253
423152
423125
423215
423251
425132
425123
425213
425231
422135
422153
431252
431225
431522
431522
431225
431252
432152
432125
432512
432521
432215
432251
432125
432152
432215
432251
432512
432521
451232
451223
451322
451322
451223
451232
452132
452123
452312
452321
452213
452231
452123
452132
452213
452231
452312
452321
421235
421253
422135
422153
423125
423152
423215
423251
425123
425132
425213
425231
512342
512324
512432
512423
512234
512243
513242
513224
513422
513422
513224
513242
512234
512243
512324
512342
512423
512432
521342
521324
521432
521423
521234
521243
523142
523124
523412
523421
523214
523241
522134
522143
522314
522341
522413
522431
541232
541223
541322
541322
541223
541232
542132
542123
542312
542321
542213
542231
543122
543122
543212
543221
543212
543221
542123
542132
542213
542231
542312
542321
521234
521243
521324
521342
521423
521432
522134
522143
522314
522341
522413
522431
523124
523142
523214
523241
523412
523421
212435
212453
213245
213254
213425
213452
215234
215243
215423
215432
221435
221453
223145
223154
223415
223451
225134
225143
225413
225431
231245
231254
231425
231452
231524
231542
232145
232154
232415
232451
232514
232541
241235
241253
242135
242153
243125
243152
243215
243251
245123
245132
245213
245231
251234
251243
251324
251342
251423
251432
252134
252143
252314
252341
252413
252431

Top   回复人:yuyu1984(yuyu) ( 一级(初级)) 信誉:100 2007-2-3 16:45:42 得分:0     ?

mark
Top   回复人:hpxs2(我来自天涯) ( 一级(初级)) 信誉:100 2007-2-3 21:43:36 得分:0     ?

都是牛人啊
Top   回复人:szm880828() ( 二级(初级)) 信誉:100 2007-2-3 22:21:55 得分:0     ?

都是大哥。。小弟我是新来学习的。。。
保留了
Top   回复人:blh(缴纳着北欧标准的税,享受着中非标准的福利) ( 二级(初级)) 信誉:100 2007-2-3 22:29:13 得分:0     ?

修改一下,我的吧 2(2) (2)2输出了两遍
import java.util.ArrayList;
import java.util.Iterator;


public class Test {

public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();

for (int a = 1; a < 7; a++) {
for (int b = 1; b < 7; b++) {
if (b == a) continue;
if ((b == 3) && (a == 5)) continue;
if ((b == 5) && (a == 3)) continue;
for (int c = 1; c < 7; c++) {
if (c == a) continue;
if (b == c) continue;
if (c == 4) continue;
if ((b == 3) && (c == 5)) continue;
if ((b == 5) && (c == 3)) continue;
for (int d = 1; d < 7; d++) {
if (d == a) continue;
if (b == d) continue;
if (c == d) continue;
if ((d == 3) && (c == 5)) continue;
if ((d == 5) && (c == 3)) continue;
for (int e = 1; e < 7; e++) {
if (e == a) continue;
if (b == e) continue;
if (c == e) continue;
if (e == d) continue;
if ((d == 3) && (e == 5)) continue;
if ((d == 5) && (e == 3)) continue;
for (int f = 1; f < 7; f++) {
if (f == a) continue;
if (b == f) continue;
if (c == f) continue;
if (e == f) continue;
if (f == d) continue;
if ((d == 3) && (f == 5)) continue;
if ((d == 5) && (f == 3)) continue;
String r = "" + a + b + c + d + e + f;
r = r.replace('6', '2');
if (!list.contains(r))
list.add(r);
}
}
}
}
}
}

System.out.println("count = " + list.size());
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}

}
}

Top   回复人:blh(缴纳着北欧标准的税,享受着中非标准的福利) ( 二级(初级)) 信誉:100 2007-2-3 22:29:33 得分:0     ?

result:
count = 198
123452
123425
123245
123254
125432
125423
125234
125243
122435
122453
132452
132425
132542
132524
132245
132254
142235
142253
143252
143225
145232
145223
152342
152324
152432
152423
152234
152243
213452
213425
213245
213254
215432
215423
215234
215243
212435
212453
231452
231425
231542
231524
231245
231254
232145
232154
232415
232451
232514
232541
241235
241253
243152
243125
243215
243251
245132
245123
245213
245231
242135
242153
251342
251324
251432
251423
251234
251243
252134
252143
252314
252341
252413
252431
221435
221453
223145
223154
223415
223451
225134
225143
225413
225431
312452
312425
312542
312524
312245
312254
315242
315224
315422
321452
321425
321542
321524
321245
321254
325142
325124
325412
325421
325214
325241
322145
322154
322415
322451
322514
322541
341252
341225
341522
342152
342125
342512
342521
342215
342251
345122
345212
345221
412235
412253
413252
413225
415232
415223
421235
421253
423152
423125
423215
423251
425132
425123
425213
425231
422135
422153
431252
431225
431522
432152
432125
432512
432521
432215
432251
451232
451223
451322
452132
452123
452312
452321
452213
452231
512342
512324
512432
512423
512234
512243
513242
513224
513422
521342
521324
521432
521423
521234
521243
523142
523124
523412
523421
523214
523241
522134
522143
522314
522341
522413
522431
541232
541223
541322
542132
542123
542312
542321
542213
542231
543122
543212
543221

Top   回复人:Mes_LHK() ( 一级(初级)) 信誉:100 2007-2-3 22:33:09 得分:0     ?

收藏 大家加油
Top   回复人:sticker_xji() ( 一级(初级)) 信誉:100 2007-2-5 8:20:26 得分:0     ?

我的感觉:
第一,不要太苛求于通用性。 有同学甚至考虑非数字的符号情况。考虑通用性不是不好,但是要分情况。如果面试题目你无边际地考虑通用情况,那么导致的结果是:不可行(限定时间内肯定有 你没考虑完备的地方);不可读(代码量肯定倍数增加,考官不可读);不简洁(不能体现关键和考点);不最优(效率方面肯定不如个别情况下优)。

第 二,不要先生成完整序列,再判断其合法性(这里的合法性包括是否符合限定条件,是否重复)。这样效率不高。比如,如果单考虑重复性,那么22XXXX的序 列一共有24种可能,如果要先生成完整序列再判断重复与否,则要冗余判断24次(24次皆为重复)。效率不好。相反,如果在生成22时即可判断重复性,则 只需要一次判断,就可不必再继续生成22X,22XX,22XXX,22XXXX等序列了。对于其他限定条件皆为如此。中心思想就是,尽可能早地判断合法 性并直接避免生成非法序列。以上有些程序也体现了这个要求。

第三,对于如何生成排列应该使用递归。递归简洁明了。

第四,对于自己的程序一定要有适当的注释,哪怕在最随便的情况下,也要保持良好的编程风格!

附:我的ANSI C程序(198为正确排列总数)
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define element_num 6 /*数字总数*/

int element[] = {1, 2, 2, 3, 4, 5}; /*数字*/
int output[element_num]; /*输出序列*/
_Bool used[] = {0, 0, 0, 0, 0, 0}; /*是否已经存在于输出序列中的flag数组*/
int count; /*合法排列个数的计数器*/

void screen_out() /*屏幕输出合法排列*/
{
int i;
for(i = 0; i < element_num; ++i)
printf("%d ", output[i]);

printf("/n");
count++;
}
/*判断当前的部分排列是否合法,包括元素是否重复,排列是否重复,是否符合题目限制*/
_Bool unused_legal_single(int current_pos, int element_index)
{
if(used[element_index]) /*用于扩展当前序列的元素是否尚未被使用*/
return false;

if(current_pos - 1 >= 0) /*3和5是否相邻*/
{
if(output[current_pos - 1] == 3 && element[element_index] == 5 ||
output[current_pos - 1] == 5 && element[element_index] == 3)
return false;

if(current_pos == 2 && element[element_index] == 4) /*4是否是当前扩展元素并将扩展于位置3*/
return false;
}

if(element_index == 2 && used[1] == false) /*在扩展第二个2的时候判断第一个2是否已经被用过,凡是扩展第二个2时第一个2尚未用过的情况均重复于扩展第一个2时第二个2尚未用过的情况*/
return false;

return true;
}

void enumerate(int current_pos) /*递归生成排列。排列从短到长生成*/
{
int i;

if(current_pos == element_num) /*如果排列已经完整,则输出*/
{
screen_out();
return;
}

for(i = 0; i < element_num; ++i)
{
if(unused_legal_single(current_pos, i)) /*如果当前扩展的序列已经不合法,则不需要继续将其扩展,可停止。否则继续扩展直到完整生成一个排列。凡有机会完整生成的排列均合法。*/
{
output[current_pos++] = element[i];
used[i] = true;
enumerate(current_pos);
current_pos--;
used[i] = false;
}
}
}

int main(int argc, char** argv)
{
count = 0; /*初始化计数器*/
enumerate(0); /*从位置0开始扩展排列并输出合法结果*/
printf("Total output: %d/n", count);
return (EXIT_SUCCESS);
}

Top   回复人:wxcmyx123(@) ( 一级(初级)) 信誉:100 2007-2-5 8:26:55 得分:0     ?

请大家注意题目:原题如下:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连.
请注意:是打印这六个数字的排列,那么412345(题目中给出的)算不算这个排列中那?如果算,也就是可重复排列,那么给出两个"2"没有任何意义,我怀疑是作者弄错了,那么大家试着想一下,如果是1.2.3.4.5这几个数排列六位数字,即可重复排列怎么算那?
Top   回复人:wxcmyx123(@) ( 一级(初级)) 信誉:100 2007-2-5 8:51:08 得分:0     ?

最节省内存的方法?,那就是我们算出来,然后一个一个的print就可以了,虽然多了点,但是相当节省内存
Top   回复人:buptrobin(听风) ( 一级(初级)) 信誉:98 2007-2-5 13:06:39 得分:0     ?

我的解法,其实就是6个盒子放4个数字的问题,排除掉35和4的限制条件就可以了.

public void getPut(){
int[] e = {2,1,3,4,5};
int[] a = new int[5];
int[] flag = new int[7];
int[] r = new int[7];
int p = 1;
int count=0;
do{
a[p]++;
if(a[p]>6) {
p--;
if(p>0) flag[a[p]] = 0;
continue;
}
if(flag[a[p]]&gt;0) continue; //already used
if(p==3 && a[p]== 3) continue;//4 at the third position
if(p==4){
if(a[4]-a[2]==1 || a[2]-a[4]==1) continue;
for(int i=0;i<7;i++) r[i]=2;
for(int i=1;i<=4;i++) r[a[i]]=e[i];
System.out.println(""+r[1]+r[2]+r[3]+r[4]+r[5]+r[6]);
count++;
continue;
}
flag[a[p]]=1;
p++;
a[p]=0;
} while(p>=1);
System.out.println("total="+count);
}

最后结果198个.
Top   回复人:ljdam(独孤黑夜) ( 二级(初级)) 信誉:100 2007-2-5 14:23:56 得分:0     ?

mark
Top   回复人:jianghu77(江湖) ( 一级(初级)) 信誉:100 2007-2-5 15:55:01 得分:0     ?


Top   回复人:mb459() ( 一级(初级)) 信誉:100 2007-2-5 16:57:00 得分:0     ?

shi哪个公司的面食题目?
Top   回复人:foobarfoobar(foobarfoobar) ( 一级(初级)) 信誉:100 2007-2-6 14:38:06 得分:0     ?

我的基本思路:

大的步骤:在6 个位置里挑4个,分别放1、3、4、5(Step1),共有x种挑法(x= 6! / 4! / 2!),每种情况都有 4! 种排列(Step2)(这样就有 x * 4! 种),然后在剩下的位置安放2(Step3,数量跟Step2相同,因为此时只有一种安排2的方法 )。

在Step1、2,剔除不符合“4不能在第三位”、“3与5不能相连”要求的情况,最后得解

总数量 = C(6,4) * 4! - C(5,3) * 3! - 5 * 2! * C(4,2) * 2! + 3 * 2! * C(3,1) * 1! = 198
Top   回复人:sixme(子曾经曰过:“基础和算法才素王道”。) ( 三级(初级)) 信誉:100 2007-2-6 15:22:42 得分:0     ?

Mark 2.
Top   回复人:javadellee() ( 一级(初级)) 信誉:100 2007-2-7 19:20:54 得分:0     ?


Top   回复人:hpxs2(我来自天涯) ( 一级(初级)) 信誉:100 2007-2-7 19:30:18 得分:0     ?

厉害啊,大家
Top   回复人:killer000777(lx_cat) ( 一级(初级)) 信誉:100 2007-2-7 19:41:53 得分:0     ?

为什么没人用Hash?
Top   回复人:beiji111() ( 一级(初级)) 信誉:100 2007-2-9 9:56:53 得分:0     ?

[url=http://www.kmwol.com]传奇世界私服[/url]
[url=http://www.ttwwol.com]传世私服[/url]
[url=http://www.ttwwol.com]传奇世界私服[/url]
Top   回复人:gaosj(我很想做程序员啊) ( 二级(初级)) 信誉:99 2007-2-9 10:21:11 得分:0     ?

学习啊!
Top   回复人:seekshelly(四客) ( 一级(初级)) 信誉:100 2007-2-14 9:47:21 得分:0     ?

路过。
Top   回复人:justformygame() ( 一级(初级)) 信誉:100 2007-2-14 10:17:04 得分:0     ?

P(5,2)*P(4,2) - [C(2,1)*C(3,1)*P(2,2)*C(3,1) - P(2,2)*C(3,1)]*3 = 198
Top   回复人:szm880828() ( 二级(初级)) 信誉:100 2007-2-14 10:32:45 得分:0     ?

又有新的算法了么???
Top   回复人:he_8134(只有星星伴明月) ( 一级(初级)) 信誉:100 2007-2-24 2:22:01 得分:0     ?

1345只考虑排列顺序有24种,可以先取出这24种排列,
然后看两个2插在它们之间的顺序有15种可能~~24*15再过滤掉附加条件~~~

这个问题我小学时半个小时能答出来,现在居然用了2个小时......
Top   回复人:atomic_age() ( 一级(初级)) 信誉:100 2007-2-24 12:02:59 得分:0     ?

public class test1
{
private int[] numbers = new int[]
{ 1, 2, 2, 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);
// String s="12", s1 = "21";
// System.out.println(s.compareTo(s1));
}
}

Top   回复人:atomic_age() ( 一级(初级)) 信誉:100 2007-2-24 12:04:12 得分:0     ?

public class test1
{
private int[] numbers = new int[]
{ 1, 2, 2, 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);
// String s="12", s1 = "21";
// System.out.println(s.compareTo(s1));
}
}


使用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

Top   回复人:atomic_age() ( 一级(初级)) 信誉:100 2007-2-24 12:14:19 得分:0     ?

看到最后的结果感到很高兴。祝各位在2007里发财!!!!
Top   回复人:goushaoping04() ( 一级(初级)) 信誉:100 2007-2-26 13:04:00 得分:0     ?

看了上面的题目后,我试编了一个,呕想应该有很多的不足,希望大侠们能帮呕完善一下:
import java.util.Iterator;
import java.util.LinkedList;

public class Test {
private LinkedList list = new LinkedList();
/**
* 进行排列
*/
private void listPlay(String startStr, String str) {
if (str.length() > 1) {
for (int i = 0; i < str.length(); i++) {
for (int j = i + 1; j < str.length(); j++) {
char[] ch = str.toCharArray();
char temp = ch[i];
ch[i] = ch[j];
ch[j] = temp;
String startStr1 = startStr + String.valueOf(ch[0]);
String s = (new String(ch)).substring(1,
(new String(ch)).length());
if ((!list.contains(startStr1 + s)) &&
isRight(startStr1 + s))
list.add(startStr1 + s);
listPlay(startStr1, s);
}
}
}
}
/**
* 判断要求
*/
private boolean isRight(String s) {
if (s.charAt(2) == '4') {
return false;
}
if (s.indexOf("35") != -1 || s.indexOf("53") != -1) {
return false;
}
return true;
}
/**
* 打印
*/
private void display() {
Iterator it = list.listIterator();
while (it.hasNext()) {
System.out.println(it.next().toString());
}
}

public static void main(String[] args) {
if (args.length > 1) {
System.out.println("输入的参数不符合要求");
} else if (args[0].trim().length() < 3) {
System.out.println("输入的参数不符合要求");
} else {
Test test = new Test();
test.listPlay("",args[0].trim());
test.display();
}
}
}

Top   回复人:oklhy() ( 一级(初级)) 信誉:99 2007-2-28 14:31:57 得分:0     ?

mark
Top   回复人:xielaixiangjx(谢香) ( 一级(初级)) 信誉:100 2007-3-1 13:37:59 得分:0     ?

up,不知道是不是高手不现身,不难吧
Top   回复人:quanfuliang414() ( 一级(初级)) 信誉:100 2007-3-1 18:06:49 得分:0     ?

这个问题每那么复杂 重复的问题可用以下的思路解决:
将第二个2换成6再输出6时将它换成2就可以了
Top   回复人:loveqong() ( 一级(初级)) 信誉:100 2007-3-1 23:06:33 得分:0     ?

各位前辈,,,
希望还可以看到更精妙的算法~~~~~~~
Top   回复人:YidingHe(机枪兵) ( 五级(中级)) 信誉:100 2007-3-2 10:46:33 得分:0     ?

我的答案:http://yiding-he.javaeye.com/blog/56950
精妙算不上,但是代码很容易看懂。
结果:198 个满足条件的排列。
Top   回复人:zhongzi253() ( 一级(初级)) 信誉:100 2007-3-6 16:12:44 得分:0     ?



思路:默认设字符串为“222222”,然后从六个位置中找四个位置放置“1345”。问题就转化为从数“1-6”做3次选择,选4个不同的数,且第三次选择的不为“3”,第二次和第四次相差不为1。

比较了一下楼上的结果,算是较优解了。而且通用性好。比如,若要求“sdffwe”排列,只需修改s和e即可。

答案:198种。

//******************************************************
#include <stdlib.h>
#include <stdio.h>

#define N 6
char e[] = "1345";
char s[] = "222222";
int p[4] = {0}; // p[i] 为 e[i]所占位置。即p[1]=2,表示e[1]就是数字3放在第二个位置。
int f[N] = {0}; // 标记位,表示第i位是否已被占。

int count = 0;

void output()
{
int i;

// 把4个数字放到相应所占位置
for (i = 0; i < 4; i++) {
s[p[i]] = e[i];
}

printf("%s", s);
count++;
}


int main()
{
for (p[0] = 0; p[0] < N; p[0]++) {
f[p[0]] = 1;
for (p[1] = 0; p[1] < N; p[1]++) {
if (1 == f[p[1]])
continue;
f[p[1]] = 1;
for (p[2] = 0; p[2] < N; p[2]++) {
//p[2]即“4”, 当占位为3时,跳过
if (p[2] == 3)
continue;
if (1 == f[p[2]])
continue;
f[p[2]] = 1;
for (p[3] = 0; p[3] < N; p[3]++) {
if (1 == f[p[3]])
continue;
//检查 3 和 5是否挨着。是,则跳过。
if ((p[3] == p[1] + 1) || (p[3] + 1 == p[1]))
continue;
f[p[3]] = 1;

output();
f[p[3]] = 0;
}
f[p[2]] = 0;
}
f[p[1]] = 0;
}
f[p[0]] = 0;
}
printf("count = [%d]/n", count);
return 1;
}
Top   回复人:zhuokai() ( 二级(初级)) 信誉:100 2007-3-6 17:20:11 得分:0     ?


public class MathTest
{
public static void main(String[] args)
{
int count = 0;
long startTime = System.currentTimeMillis();
for(int i=122345;i<=543221;i++)
{
if(isOk(String.valueOf(i)))
{
System.out.print(i + "/t");
count ++;
if(count % 9 == 0)
System.out.println();
}
}
System.out.println("/nThe count is:" + count);
System.out.println("The total time is:" +
(System.currentTimeMillis() - startTime));
}

private static boolean isOk(String string)
{
if(string.indexOf('1') == -1)
return false;
else if(string.indexOf('3') == -1)
return false;
else if(string.indexOf('4') == -1)
return false;
else if(string.indexOf('5') == -1)
return false;
else
{
int index = string.indexOf('2');
if(index == -1)
return false;
else
{
String stringTemp = string.substring(index+1,string.length());
if(stringTemp.indexOf('2') != -1)
{
if((string.indexOf('4') != 2)
&& (string.indexOf("35") == -1)
&& (string.indexOf("53") == -1))
return true;
else
return false;
}
else
return false;
}
}
}
}
Top   回复人:wucanbi() ( 一级(初级)) 信誉:100 2007-3-6 19:59:10 得分:0     ?

mark

Top   回复人:hunteringjob() ( 一级(初级)) 信誉:100 2007-3-7 15:20:17 得分:0     ?

关于这个问题,看了楼上的回复,感觉受益匪浅!本人在这里提供一种很“土“的处理方式,或许对大家有点帮助!
思路:
(1)数字1,2,2,3,4,5其实可以考虑把其中的一个2替换为6,最后再把6转换为2;
(2)数字目前的范围应该是:123456-654321,然后判断符合条件的:
(2.1)如果数字里面包括的数字有大于6或者==0的;不符合条件;
(2.2)如果包括重复数字的,不符合条件;
(2.3)如果"4"在第三个位置的以及"35"在一块的,不符合条件;
(3)把符合条件的6,替换为2;
=======================================================
//下列代码实现条件2.1和2.2,
private static boolean validateString(String s) {
String tempString[] = new String[s.length()];
Set tempSet = new HashSet();
for (int i = 0; i < tempString.length; i++) {
tempString[i] = s.substring(i, i + 1);
if (Integer.parseInt(tempString[i]) > 6 || Integer.parseInt(tempString[i]) == 0)
return false;
tempSet.add(tempString[i]);
}
if (tempSet.size() < 6)
return false;
return true;

}
=================================================
//implement condition of 2.3
private static String printString(String s) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
if (s.substring(i, i + 1).equals("6"))
sb.append("2");
else
sb.append(s.substring(i, i + 1));

}
return sb.toString();
}
===============================================
//Print all Result String
private static void generateAllString() {
for (int i = 123456; i <= 654321; i++) {
String tempString = String.valueOf(i);
if (validateString(tempString))
if (tempString.indexOf("4") != 2)
if (tempString.indexOf("35") != -1) {
System.out.println(printString(tempString));
}
}

}
==================================
打印测试结果正常!
Top   回复人:chszs(老刀) ( 四级(中级)) 信誉:100 2007-3-7 16:28:36 得分:0     ?

我用笔算了一次,为294种,算法随后贴出。
6!/2!-5!/2!-2*4!/2!+3*2*3!/2=294种
Top   回复人:sharp_air() ( 一级(初级)) 信誉:100 2007-3-7 17:17:12 得分:0     ?

我算的答案是240个,有答案和我一样的么???
Top   回复人:zhigang_33(正在编码) ( 一级(初级)) 信誉:100 2007-3-8 8:56:30 得分:0     ?

mark
Top   回复人:scuhao() ( 一级(初级)) 信誉:100 2007-3-8 9:16:06 得分:0     ?

不错不错!学习ing。。。
Top   回复人:whfasrp2005() ( 一级(初级)) 信誉:100 2007-3-8 12:34:21 得分:0     ?

历害,学习
Top   回复人:rfv1116() ( 一级(初级)) 信誉:100 2007-3-8 13:19:54 得分:0     ?

都是高手 学学 呵呵
Top   回复人:zhongzi253() ( 一级(初级)) 信誉:100 2007-3-8 13:26:28 得分:0     ?

上一次发的帖子,output函数少了一句。打印有点错误。
////////////////////////////////////
void output()
{
int i;

memset(s, '2', strlen(s)); //修改。 还原s为"222222".

// 把4个数字放到相应所占位置
for (i = 0; i < 4; i++) {
s[p[i]] = e[i];
}

printf("%s", s);
count++;
}
//////////////////////////////////


思路:默认设字符串为“222222”,然后从六个位置中找四个位置放置“1345”。问题就转化为从数“1-6”做3次选择,选4个不同的数,且第三次选择的不为“3”,第二次和第四次相差不为1。

比较了一下楼上的结果,算是较优解了。而且通用性好。比如,若要求“sdffwe”排列,只需修改s和e即可。

答案:198种。

//******************************************************
#include <stdlib.h>
#include <stdio.h>

#define N 6
char e[] = "1345";
char s[] = "222222";
int p[4] = {0}; // p[i] 为 e[i]所占位置。即p[1]=2,表示e[1]就是数字3放在第二个位置。
int f[N] = {0}; // 标记位,表示第i位是否已被占。

int count = 0;

void output()
{
int i;

memset(s, '2', strlen(s)); //改。 还原s为"222222".

// 把4个数字放到相应所占位置
for (i = 0; i < 4; i++) {
s[p[i]] = e[i];
}

printf("%s", s);
count++;
}


int main()
{
for (p[0] = 0; p[0] < N; p[0]++) {
f[p[0]] = 1;
for (p[1] = 0; p[1] < N; p[1]++) {
if (1 == f[p[1]])
continue;
f[p[1]] = 1;
for (p[2] = 0; p[2] < N; p[2]++) {
//p[2]即“4”, 当占位为3时,跳过
if (p[2] == 3)
continue;
if (1 == f[p[2]])
continue;
f[p[2]] = 1;
for (p[3] = 0; p[3] < N; p[3]++) {
if (1 == f[p[3]])
continue;
//检查 3 和 5是否挨着。是,则跳过。
if ((p[3] == p[1] + 1) || (p[3] + 1 == p[1]))
continue;
f[p[3]] = 1;

output();
f[p[3]] = 0;
}
f[p[2]] = 0;
}
f[p[1]] = 0;
}
f[p[0]] = 0;
}
printf("count = [%d]/n", count);
return 1;
}

Top   回复人:lifeisadream() ( 一级(初级)) 信誉:100 2007-3-8 13:44:09 得分:0     ?

... ...
有点汗,这么多人是写针对数据的不通用的东西
Top   回复人:Mr_Wrong() ( 一级(初级)) 信誉:100 2007-3-8 13:57:03 得分:0     ?

mark
Top   回复人:Daem0n(瓶中的精灵) ( 二级(初级)) 信誉:100 2007-3-8 16:07:44 得分:0     ?

mark
Top   回复人:qczl1224(倾情一世『qczl.ys168.com』) ( 四级(中级)) 信誉:100 2007-3-8 17:21:07 得分:0     ?

看到都晕了, 学历地还是不行呀,。。
Top   回复人:javaGirlOrBoy() ( 三级(初级)) 信誉:104 2007-3-8 22:02:29 得分:0     ?

mark

Top   回复人:chllcy(搬张小板凳,听星星们的高见) ( 一级(初级)) 信誉:100 2007-3-8 23:12:16 得分:0     ?

..............晕西晕
Top   回复人:guofangsky(嘉嘉) ( 一级(初级)) 信誉:100 2007-3-9 11:56:25 得分:0     ?

mark,学习中
Top   回复人:sharp_air() ( 一级(初级)) 信誉:100 2007-3-9 14:57:13 得分:0     ?

呵呵,我用正则做了一下,是不是还能再优化啊

import java.util.regex.*;

public class FiveList {
static boolean aa=false;
static int icount=0;
public static void main(String[] args) {
for(int i=122345;i<=543221;i++) {
String stri=String.valueOf(i);
Pattern p=Pattern.compile("(?!((.*?35)|(.*?53)))^[1-5][1-5][1235][1-5][1-5][1-5]$");
Matcher m=p.matcher(stri);
boolean rs=m.find();
if(rs){
int s1=0,s2=0,s3=0,s4=0,s5=0;
for(int xi=0;xi<6;xi++){
if("1".equals(String.valueOf(stri.charAt(xi)))){s1++;}
if("2".equals(String.valueOf(stri.charAt(xi)))){s2++;}
if("3".equals(String.valueOf(stri.charAt(xi)))){s3++;}
if("4".equals(String.valueOf(stri.charAt(xi)))){s4++;}
if("5".equals(String.valueOf(stri.charAt(xi)))){s5++;}
if(s2==2&&s1==1&&s3==1&&s4==1&&s5==1){aa=true;}else{aa=false;}
if(aa){
icount++;
System.out.println(stri);
}
}
aa=false;
}
}
System.out.println("总数是:"+icount);
}
}

总数是:198
Top   回复人:houfeng_dao() ( 一级(初级)) 信誉:100 2007-3-11 0:43:46 得分:0     ?

好帖子
Top   回复人:SOULisy() ( 一级(初级)) 信誉:100 2007-3-12 10:06:59 得分:0     ?

……都是高手啊!
Top   回复人:shaoze5(劭泽) ( 一级(初级)) 信誉:100 2007-3-12 18:53:37 得分:0     ?

public class test {
public static void main(String[] args) {
int i = 12345;
for (i=122345; i <= 543221; i = next(i)) {
String str = i+"";
if (str.substring(2,3).equals("4")) continue;
if (str.indexOf("35") != -1) continue;
if (str.indexOf("53") != -1) continue;
if (str.indexOf("1") == -1) continue;
if (str.indexOf("2") == -1) continue;
if (str.indexOf("3") == -1) continue;
if (str.indexOf("4") == -1) continue;
if (str.indexOf("5") == -1) continue;
int start = str.indexOf("2");
int end = str.lastIndexOf("2");
if (start == end) continue;
System.out.println(i);
}
}

public static int next(int i) {
String str = i+"";
int no = str.lastIndexOf("55555");
if (no == 1) {
i =i+55555;
return ++i;
}
no = str.lastIndexOf("5555");
if (no == 2) {
i =i+5555;
return ++i;
}
no = str.lastIndexOf("555");
if (no == 3) {
i =i+555;
return ++i;
}
no = str.lastIndexOf("55");
if (no == 4) {
i = i+55;
return ++i;
}
no = str.lastIndexOf("5");
if (no == 5) {
i = i+5;
}
return ++i;
}
}
Top   回复人:xp1204(深圳不是个好地方,我却还是要待下去) ( 三级(初级)) 信誉:100 2007-3-13 10:02:49 得分:0     ?

public static void main(String[] args){
int count = 0;

for (int i=122345;i<=543221;i++){


//必须包含1、2、3、4、5
if (((i+"").indexOf("1")==-1) ||
((i+"").indexOf("2")==-1)||
((i+"").indexOf("3")==-1)||
((i+"").indexOf("4")==-1)||
((i+"").indexOf("5")==-1)
) continue;
//"3"与"5"不能相连
if (((i+"").indexOf("35")>-1) ||
((i+"").indexOf("53")>-1)) continue;
//必须有两个2
if ((i+"").split("2").length<3)continue;


//4不能出现在第3位
if ((i+"").indexOf("4")==2) continue;


System.out.println(i);

count++;

}
Top   回复人:xp1204(深圳不是个好地方,我却还是要待下去) ( 三级(初级)) 信誉:100 2007-3-13 10:03:35 得分:0     ?

122345
122543
123245
123254
123425
125234
125243
125423
132245
132254
132425
132524
142325
142523
143225
145223
152234
152243
152324
152423
212345
212543
213245
213254
213425
215234
215243
215423
221345
221543
223145
223154
223415
223451
225134
225143
225413
225431
231245
231254
231425
231524
232145
232154
232415
232451
232514
232541
241325
241523
242315
242513
243125
243215
243251
245123
245213
245231
251234
251243
251324
251423
252134
252143
252314
252341
252413
252431
312245
312254
312425
312524
315224
321245
321254
321425
321524
322145
322154
322415
322451
322514
322541
325124
325214
325241
325421
341225
342125
342215
342251
342521
345221
412325
412523
413225
415223
421325
421523
422315
422513
423125
423215
423251
425123
425213
425231
431225
432125
432215
432251
432521
451223
452123
452213
452231
452321
512234
512243
512324
512423
513224
521234
521243
521324
521423
522134
522143
522314
522341
522413
522431
523124
523214
523241
523421
541223
542123
542213
542231
542321
543221
count: 142
Top   回复人:lovelyxinxin_1983(断剑残影,风语龙渊!) ( 一级(初级)) 信誉:100 2007-3-13 18:29:03 得分:0     ?

?
Top   回复人:kjeny2002(小杭) ( 三级(初级)) 信誉:105 2007-3-13 18:38:10 得分:0     ?

递归一下,,然后再加个判断
Top   回复人:lwhhuahua() ( 一级(初级)) 信誉:100 2007-3-20 13:04:33 得分:0     ?

JianZhiZG(健之) 高手! 怎么想出来的这方法



Top   回复人:qytang() ( 一级(初级)) 信誉:100 2007-3-20 17:24:07 得分:0     ?

这个题目有没有正则表达式的解法?
Top   回复人:lch710097() ( 一级(初级)) 信誉:100 2007-3-20 19:37:12 得分:0     ?

public class Pailei{
public static void main(String[] args){
String s;
int a=0;
for(int i=122345;i<=543221;i++){
s=String.valueOf(i);
if(s.indexOf("6")!=-1||s.indexOf(7)!=-1||
s.indexOf("8")!=-1||s.indexOf("9")!=-1||s.indexOf("0")!=-1||
s.indexOf("1")==-1||s.indexOf("2")==-1||s.indexOf("3")==-1||s.indexOf("4")==-1||s.indexOf("5")==-1||
s.indexOf("53")!=-1||s.indexOf("35")!=-1|| s.indexOf("4")==2||s.indexOf("2")==s.lastIndexOf("2")){
continue;
}else{
a++;
System.out.println(s);
}
}
System.out.println("total counts:"+a);
}
}


total counts: 198
Top   回复人:qualylee() ( 一级(初级)) 信誉:100 2007-3-20 23:50:06 得分:0     ?

mark!!
:)
Top   回复人:xuhengdp(修炼ing) ( 一级(初级)) 信誉:100 2007-3-21 22:04:18 得分:0     ?


Top   回复人:billy5118() ( 一级(初级)) 信誉:100 2007-3-22 23:58:05 得分:0     ?

算法问题
Top   回复人:hwldm0101() ( 一级(初级)) 信誉:100 2007-3-23 0:25:50 得分:0     ?

希望一个月后我也能看明白这些代码

Top   回复人:gyryqtfy(日月) ( 一级(初级)) 信誉:100 2007-3-23 13:11:41 得分:0     ?

只能说学习
 
原创粉丝点击