給定一個無向無環圖,求圖的直徑。
這裏直徑是指最大的兩個節點間的邊的數量。java
第一行是N,表示測試組數的數量,每組的輸入以下:
每組的一行是M,表示節點的個數,後續是M - 1 行的正整數n1,n2表示n1和n2之間有一條邊。node
每行一個輸出表示對應測試圖數據的直徑。面試
輸入:算法
1
9
1 2
2 3
3 4
2 5
4 6
5 7
5 8
8 9編程
輸出:數據結構
6學習
import java.util.*; /** * @author cdfive * @date 2019-03-30 */ public class MainQ1At20190330 { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); // key is nodeNum and value is the relation nodes Map<Integer, List<Integer>> nodeLinkMap = new HashMap<Integer, List<Integer>>(); for (int i = 0; i < n; i++) { // Prepare data, store two way relationships int m = in.nextInt(); for (int j = 0; j < m - 1; j++) { int n1 = in.nextInt(); int n2 = in.nextInt(); // n1 and n1's relation nodes List<Integer> list = nodeLinkMap.get(n1); if (list == null) { list = new ArrayList<Integer>(); nodeLinkMap.put(n1, list); } list.add(n2); // n2 and n2's relation nodes List<Integer> list2 = nodeLinkMap.get(n2); if (list2 == null) { list2 = new ArrayList<Integer>(); nodeLinkMap.put(n2, list2); } list2.add(n1); } List<Integer> curMaxLinkNodes; int maxLink = 0;// store the result for (int k = 1; k <= m; k++) { curMaxLinkNodes = new ArrayList<Integer>(); curMaxLinkNodes.add(k); List<Integer> linkNodes = new ArrayList<Integer>(); linkNodes.add(k); curMaxLinkNodes = processMaxLink(nodeLinkMap, k, linkNodes, curMaxLinkNodes); if (curMaxLinkNodes.size() - 1 > maxLink) { maxLink = curMaxLinkNodes.size() - 1; } } // Print the result System.out.println(maxLink); } } // Process max link private static List<Integer> processMaxLink(Map<Integer, List<Integer>> nodeLinkMap, Integer next, List<Integer> linkNodes, List<Integer> maxLinkNodes) { List<Integer> list = nodeLinkMap.get(next); if (list == null || list.size() == 0 || linkNodes.containsAll(list)) { return linkNodes; } for (Integer node : list) { if (linkNodes.contains(node)) { continue; } List<Integer> tmpLinkNodes = new ArrayList<Integer>(linkNodes); tmpLinkNodes.add(node); tmpLinkNodes = processMaxLink(nodeLinkMap, node, tmpLinkNodes, maxLinkNodes); if (tmpLinkNodes.size() > maxLinkNodes.size()) { maxLinkNodes = tmpLinkNodes; } } return maxLinkNodes; } }
昨天下班路上,接到某大廠的筆試通知,內心有些激動,畢竟這麼多年來不多有大廠筆試面試的機會。
郵件裏介紹和描述一看就是大廠規範、文化,很吸引人。可看到nowcoder連接,表示很慌。筆試題是2道編程問答題,1個半小時。
本身數據結構、算法什麼的已經遺忘了好久,即便回到好久之前在學校,也是很弱。晚上在網站上逛了逛,更沒信心了。想一想明天筆試,就當見識一下吧。測試
今天上午打開連接,有2個例子,示例如何輸入輸出。
而後第一題,看到無向無環圖
,當時就想放棄治療了。腦子裏在想,但怕只能交個白卷了- -!
切到下一題,意外發現這道題目挺溫柔的,好像能作。因而參考例子代碼的,在線的開發環境裏開始寫。
修改保存調試幾回,第2題的 test case經過了!挺高興也有了點信心,因而切回第一題開始認真讀題。
讀了幾遍而後根據例子輸入在紙上畫。把節點和邊畫出來,而後看例子輸出,明白什麼意思了。
可程序仍是不會寫,時間已過半。後面想到一個思路,把輸入的節點的關係用HashMap<Integer, Integer>
先存起來,而後遍歷去找最大值。
調試中發現一個節點對應多個節點,因而把HashMap<Integer, Integer>
改成HashMap<Integer, List<Integer>>
,找最大值想到遞歸去遍歷,調試打印發現結果不對打印是4。
眼看最後1分鐘,遞歸那裏思路有點亂仍是沒寫好,最後倒計時,只能提交試卷了。網站
下來想了想,除了遞歸那裏有問題,保存節點應該是雙向保存,當時沒有考慮到。
以上是剛完善的程序,按例子的輸入,輸出正確。但仍是有些不肯定,確定不是最有解,數據結構、解題思路應該有更好的。調試
話說牛客網(nowcoder)網站的用戶體驗真的很好,學習氛圍濃,彷彿有種在學校裏學習的感受。
名字也挺有意思的,nowcoder,牛客:)
總覺得工做中不經常使用,就能夠不學習不鞏固了。找工做時,才發現基礎知識、基本功的重要性。
今年打算用業餘時間把數據結構、算法補一下,經常使用的、熱門的知識點和題目爭取掌握。
業精於勤荒於嬉,向認識的、勤奮的同窗好好學習,加油!
也但願早點找到合適的工做並穩定下來。
心要年輕,路還很長。