一著å软äšgå…¬å¸çš„java½W”试½Ž—法题的½{”案
原题如下åQšç”¨1ã€?ã€?ã€?ã€?ã€?˜q™å…个数å—,用java写一个程åºï¼Œæ‰“å°å‡ºæ‰€æœ‰ä¸åŒçš„æŽ’列åQŒå¦‚åQ?12234ã€?12345½{‰ï¼Œè¦æ±‚åQ?4"ä¸èƒ½åœ¨ç¬¬ä¸‰ä½åQ?3"ä¸?5"ä¸èƒ½ç›¸è¿žã€?/p>
解题æ€èµ\åQ?/p>
很明显,˜q™æ˜¯ä¸€ä¸ªé€’å½’½Ž—法。我们å¯ä»¥æŽ’列将˜q?个数按从ž®åˆ°å¤§çš„™åºåºæŽ’一下,如果æ˜?,2,3,4,5,6åQŒé‚£ä¹ˆä¼šæœ?*2*3*4*5*6= 6!=720个递增的数。但如果æ˜?,2,2,3,4,5åQŒé‚£ä¹ˆåœ¨˜q?20个数ä¸ä¸€å®šä¼šæœ‰ç›¸åŒçš„æ•°å¯¹å‡ºçްåQˆç”±äºŽåœ¨˜q?个数ä¸åªæœ‰ä¸¤ä¸ªæ•°ä¸¤åŒåQŒä¹Ÿž®±æ˜¯è¯ß_¼Œå¦‚果有é‡å¤çš„æ•ŽÍ¼Œé‚£ä¹ˆä¸€å®šæ˜¯ä¸€å¯ÒŽ(gu¨©)•°åQŒå¦‚122345会出çŽîC¸¤‹Æ¡ï¼‰ã€?/p>
排列的基本规则是分楘q›è¡Œã€‚也ž®±æ˜¯è¯ß_¼Œè¦æŽ’列上é?个数åQŒé¦–先应该选择½W¬ä¸€ä¸ªæ•°åQŒè¿™½W¬ä¸€ä¸ªæ•°å¯ä»¥é€‰æ‹©˜q?个数ä¸çš„ä»ÀL„一个,如选择1.½W¬äºŒæ¥æ˜¯é€‰æ‹©½W¬äºŒä¸ªæ•°åQŒè¿™½W¬äºŒä¸ªæ•°ä¸èƒ½å†é€‰æ‹©å·²ç»é€‰è¿‡çš„æ•°åQŒå¦‚1.å› æ¤åQŒå®ƒåªèƒ½ä»ŽåŽé?个数ä¸é€‰æ‹©ã€‚如选择2。以æ¤ç±»æŽ¨ã€?/p>
我们也å¯ä»¥åœ¨½E‹åºä¸æ¨¡æ‹Ÿè¿™ä¸€˜q‡ç¨‹ã€‚溽E‹åºå¦‚下åQ?/p>
public class test1
{
private int[] numbers = new int[]
{ 1, 2, 3, 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("æ€ÀL•°åQ? + t.n);
}
}
å…¶ä¸listå‡½æ•°æ˜¯è¿™ä¸ªç®—æ³•çš„æ ¸å¿ƒå‡½æ•°ã€‚index傿•°è¡¨ç¤ºå·²ç»é€‰æ‹©˜q‡çš„æ•ŽÍ¼Œç”¨numbers数组的烦引表½Cºã€‚如index="012"åQŒè¡¨½Cºnumbersçš„å‰ä¸‰ä¸ªæ•°å·²¾l被选择åQŒä¹Ÿè¡¨ç¤ºåº”该选择½W¬å››ä¸ªæ•°äº†ï¼Œè€Œè¿™½W¬å››ä¸ªæ•°åº”该从åŽä¸‰ä¸ªæ•îC¸é€‰æ‹©ã€‚result傿•°è¡¨ç¤ºä¸´æ—¶çš„æ•°å—组åˆï¼ˆ˜q™ä¸ªæ•°å—¾l„åˆæœ€å¤šæ˜¯5个数å—ï¼Œå› äØ“åQŒå¦‚果到äº?个数å—,ž®Þp¡¨½Cºå·²¾l有一个结果äñ”生了åQ‰ã€‚在默认情况下indexå’Œresult的值都æ˜?"ã€?/p>
在validateä¸ä‹É用了 if (s.compareTo(lastResult) <= 0)˜q›è¡Œåˆ¤æ–åQŒç”±äºŽæŒ‰˜q™ç§æ–ÒŽ(gu¨©)³•˜q›è¡ŒæŽ’列åQŒå¦‚果这6个数是递增¾l™å‡ºçš„,那么排列的结果一定是递增的,但上˜q°çš„6个数其丽W?和第3个佾|®ä¸Šéƒ½æ˜¯2,å› æ¤åQŒå¦‚果出çŽîCº†ä¸Šä¸€ä¸ªç»“果丞®äºŽå½“剾l“果的情况,一定是有é‡å¤äº†åQŒå› æ¤ï¼Œè¦å°†˜q™éƒ¨åˆ†æ•°˜q‡æ×o出去ã€?/p>
使用1, 2, 2, 3, 4, 5的测试结�/p>
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
æ€ÀL•°åQ?98
使用1,2, 3, 3, 4, 5的测试结�/p>
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
æ€ÀL•°åQ?18
使用1, 3, 3, 3, 4, 5的测试结�/p>
133345
313345
315433
331345
331543
333145
333154
333415
333451
343315
345133
433315
451333
513334
513343
513433
541333
543133
543313
543331
æ€ÀL•°åQ?0
==================================================================================================================================================
å¦ä¸€ä¸ªç”案:
====================================================================================================================================================
public class DefTest
{
public static boolean validate(String s)
{
if (s.charAt(2) == '4')
return false;
if (s.indexOf("35") >= 0 || s.indexOf("53") >= 0)
return false;
return true;
}
public static void main(String[] ssdfa) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException
{
cmp("","122345");
}
public static void cmp(String p,String ss)
{
if(ss.length() == 1)
{
if(validate(p+ss))
System.out.println(p+ss);
return;
}
for(int i=0;i<ss.length();i++)
{
if(ss.indexOf(ss.charAt(i)) == i)
cmp(p+ss.charAt(i),ss.substring(0,i)+ss.substring(i+1, ss.length()));
}
}
}