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

          常用鏈接

          留言簿(12)

          隨筆分類(lèi)

          隨筆檔案

          groovy

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          算法程序題:

              該公司筆試題就1個(gè),要求在10分鐘內(nèi)作完。

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

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

          采用二維數(shù)組定義圖結(jié)構(gòu),最后的代碼是:

           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();// 用于保存結(jié)果,具有過(guò)濾相同結(jié)果的作用。
          14
          15    public static void main(String[] args) {
          16        new TestQuestion().start();
          17    }

          18
          19    private void start() {
          20        // 創(chuàng)建合法路徑標(biāo)識(shí)集合
          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     * 深度優(yōu)先遍歷
          47     * 
          48     * @param startIndex
          49     */

          50    private void depthFirstSearch(int startIndex) {
          51        // 遞歸的工作
          52        visited[startIndex] = true;// 用于標(biāo)識(shí)已經(jīng)走過(guò)的節(jié)點(diǎn)
          53        result = result + b[startIndex];// 構(gòu)造結(jié)果
          54        if (result.length() == n) {
          55            treeSet.add(result);// 添加到TreeSet類(lèi)型中,具有過(guò)濾相同結(jié)果的作用
          56        }

          57        // 每走到一個(gè)節(jié)點(diǎn),挨個(gè)遍歷下一個(gè)節(jié)點(diǎn)
          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;// 取消訪問(wèn)標(biāo)識(shí)
          68    }

          69}

          70

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

              WE準(zhǔn)高手
          posted on 2008-02-27 14:30 大衛(wèi) 閱讀(3003) 評(píng)論(12)  編輯  收藏 所屬分類(lèi): Java

          FeedBack:
          # re: 對(duì)一個(gè)算法筆試題的注解 2008-02-27 19:56 junglesong的博客
          不錯(cuò)!  回復(fù)  更多評(píng)論
            
          # re: 對(duì)一個(gè)算法筆試題的注解 2008-02-27 21:16 --dntask
          # re: 對(duì)一個(gè)算法筆試題的注解 2008-02-27 21:26 Edward's
          # re: 對(duì)一個(gè)算法筆試題的注解 2008-02-29 13:48 xdcsoft
          10分鐘能寫(xiě)出來(lái)嗎?
          我是不能啊  回復(fù)  更多評(píng)論
            
          # re: 對(duì)一個(gè)算法筆試題的注解 2008-03-02 14:38 xifu
          不錯(cuò),多了一條路子  回復(fù)  更多評(píng)論
            
          # re: 對(duì)一個(gè)算法筆試題的注解 2008-03-02 18:03 macrochao
          這道題剛拿到手以為很簡(jiǎn)單,其實(shí)還是很有難度的  回復(fù)  更多評(píng)論
            
          # re: 對(duì)一個(gè)算法筆試題的注解 2008-03-04 11:18 思想的盛宴
          十分鐘可以寫(xiě)出這樣的程序?誰(shuí)站起來(lái)回答我  回復(fù)  更多評(píng)論
            
          # re: 對(duì)一個(gè)算法筆試題的注解 2008-03-08 17:16 xinzhang
          # re: 對(duì)一個(gè)算法筆試題的注解 2008-03-19 09:43 xiao
          我是暫時(shí)搞不定的  回復(fù)  更多評(píng)論
            
          # re: 對(duì)一個(gè)算法筆試題的注解 2008-09-25 12:44 somebody
          此答案不可取。
          對(duì)于一個(gè)沒(méi)有工作過(guò)的人,TreeSet能知道的有幾個(gè)人?
          如果沒(méi)有幾個(gè)人知道的話,那么這個(gè)答案就是不可取的。
          一拿到這個(gè)題的人能想到這種算法,我佩服了。  回復(fù)  更多評(píng)論
            
          # re: 對(duì)一個(gè)算法筆試題的注解 2010-12-01 16:23 hehui
          result = result.substring(0, result.length() - 1);
            回復(fù)  更多評(píng)論
            
          # re: 對(duì)一個(gè)算法筆試題的注解 2010-12-01 16:25 hehui
          我沒(méi)看懂這句
          result = result.substring(0, result.length() - 1);
          我感覺(jué)是多余的!但是沒(méi)這有這句,運(yùn)行有只有一個(gè)結(jié)果?
          為什么?
            回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 廉江市| 卢湾区| 邯郸市| 永清县| 青河县| 隆昌县| 新宁县| 伊通| 阿荣旗| 鄂州市| 桃园县| 保亭| 宝坻区| 军事| 岐山县| 富顺县| 县级市| 隆回县| 五指山市| 望城县| 浏阳市| 通州市| 东丰县| 寻甸| 邢台县| 望谟县| 青田县| 马关县| 鸡西市| 伊宁市| 百色市| 东海县| 左权县| 苗栗市| 鹰潭市| 清镇市| 陵水| 日喀则市| 姚安县| 杨浦区| 和林格尔县|