隨筆 - 55  文章 - 187  trackbacks - 0
          <2008年2月>
          272829303112
          3456789
          10111213141516
          17181920212223
          2425262728291
          2345678

          常用鏈接

          留言簿(12)

          隨筆分類

          隨筆檔案

          groovy

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          算法程序題:

              該公司筆試題就1個,要求在10分鐘內作完。

              題目如下:用1、2、2、3、4、5這六個數字,用java寫一個main函數,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"與"5"不能相連。

            基本思路:
          1 把問題歸結為圖結構的遍歷問題。實際上6個數字就是六個結點,把六個結點連接成無向連通圖,對于每一個結點求這個圖形的遍歷路徑,所有結點的遍歷路徑就是最后對這6個數字的排列組合結果集。
          2 顯然這個結果集還未達到題目的要求。從以下幾個方面考慮:
            1. 3,5不能相連:實際要求這個連通圖的結點3,5之間不能連通, 可在構造圖結構時就滿足改條件,然后再遍歷圖。
            2. 不能有重復: 考慮到有兩個2,明顯會存在重復結果,可以把結果集放在TreeSet中過濾重復結果。//TreeSet用于過濾一個集合中相同的東西還真是個挺不錯的方法
            3. 4不能在第三位: 仍舊在結果集中去除滿足此條件的結果。

          采用二維數組定義圖結構,最后的代碼是:

           1package test;
           2
           3import java.util.Iterator;
           4import java.util.TreeSet;
           5
           6public class TestQuestion {
           7
           8    private String[] b = new String[] "1""2""2""3""4""5" };
           9    private int n = b.length;
          10    private boolean[] visited = new boolean[n];
          11    private int[][] a = new int[n][n];
          12    private String result = "";
          13    private TreeSet treeSet = new TreeSet();// 用于保存結果,具有過濾相同結果的作用。
          14
          15    public static void main(String[] args) {
          16        new TestQuestion().start();
          17    }

          18
          19    private void start() {
          20        // 創建合法路徑標識集合
          21        for (int i = 0; i < n; i++{
          22            for (int j = 0; j < n; j++{
          23                if (i == j) {
          24                    a[i][j] = 0;
          25                }
           else {
          26                    a[i][j] = 1;
          27                }

          28            }

          29        }

          30        a[3][5= 0;
          31        a[5][3= 0;
          32        for (int i = 0; i < n; i++{
          33            this.depthFirstSearch(i);// 深度遞歸遍歷
          34        }

          35        Iterator it = treeSet.iterator();
          36        while (it.hasNext()) {
          37            String string = (String) it.next();
          38
          39            if (string.indexOf("4"!= 2{
          40                System.out.println(string);
          41            }

          42        }

          43    }

          44
          45    /**
          46     * 深度優先遍歷
          47     * 
          48     * @param startIndex
          49     */

          50    private void depthFirstSearch(int startIndex) {
          51        // 遞歸的工作
          52        visited[startIndex] = true;// 用于標識已經走過的節點
          53        result = result + b[startIndex];// 構造結果
          54        if (result.length() == n) {
          55            treeSet.add(result);// 添加到TreeSet類型中,具有過濾相同結果的作用
          56        }

          57        // 每走到一個節點,挨個遍歷下一個節點
          58        for (int j = 0; j < n; j++{
          59            if (a[startIndex][j] == 1 && visited[j] == false{
          60                depthFirstSearch(j);// 深度遞歸遍歷
          61            }
           else {
          62                continue;
          63            }

          64        }

          65        // 遞歸的收尾工作
          66        result = result.substring(0, result.length() - 1);
          67        visited[startIndex] = false;// 取消訪問標識
          68    }

          69}

          70

          --------------------

              WE準高手
          posted on 2008-02-27 14:30 大衛 閱讀(2997) 評論(12)  編輯  收藏 所屬分類: Java

          FeedBack:
          # re: 對一個算法筆試題的注解 2008-02-27 19:56 junglesong的博客
          不錯!  回復  更多評論
            
          # re: 對一個算法筆試題的注解 2008-02-27 21:16 --dntask
          好!  回復  更多評論
            
          # re: 對一個算法筆試題的注解 2008-02-27 21:26 Edward's
          高  回復  更多評論
            
          # re: 對一個算法筆試題的注解 2008-02-29 13:48 xdcsoft
          10分鐘能寫出來嗎?
          我是不能啊  回復  更多評論
            
          # re: 對一個算法筆試題的注解 2008-03-02 14:38 xifu
          不錯,多了一條路子  回復  更多評論
            
          # re: 對一個算法筆試題的注解 2008-03-02 18:03 macrochao
          這道題剛拿到手以為很簡單,其實還是很有難度的  回復  更多評論
            
          # re: 對一個算法筆試題的注解 2008-03-04 11:18 思想的盛宴
          十分鐘可以寫出這樣的程序?誰站起來回答我  回復  更多評論
            
          # re: 對一個算法筆試題的注解 2008-03-08 17:16 xinzhang
          很好  回復  更多評論
            
          # re: 對一個算法筆試題的注解 2008-03-19 09:43 xiao
          我是暫時搞不定的  回復  更多評論
            
          # re: 對一個算法筆試題的注解 2008-09-25 12:44 somebody
          此答案不可取。
          對于一個沒有工作過的人,TreeSet能知道的有幾個人?
          如果沒有幾個人知道的話,那么這個答案就是不可取的。
          一拿到這個題的人能想到這種算法,我佩服了。  回復  更多評論
            
          # re: 對一個算法筆試題的注解 2010-12-01 16:23 hehui
          result = result.substring(0, result.length() - 1);
            回復  更多評論
            
          # re: 對一個算法筆試題的注解 2010-12-01 16:25 hehui
          我沒看懂這句
          result = result.substring(0, result.length() - 1);
          我感覺是多余的!但是沒這有這句,運行有只有一個結果?
          為什么?
            回復  更多評論
            
          主站蜘蛛池模板: 莱芜市| 张家港市| 如东县| 增城市| 合阳县| 潢川县| 唐河县| 沁水县| 广河县| 舟山市| 新宾| 乐山市| 西乌珠穆沁旗| 临海市| 泸州市| 泰和县| 介休市| 日照市| 洱源县| 香港 | 开阳县| 科尔| 金门县| 思茅市| 潞城市| 沛县| 咸宁市| 桐梓县| 和静县| 湾仔区| 潞城市| 读书| 翁牛特旗| 牡丹江市| 民权县| 白山市| 刚察县| 四川省| 利川市| 交城县| 前郭尔|