記一道後端筆試題目

題目描述

給定一個無向無環圖,求圖的直徑。
這裏直徑是指最大的兩個節點間的邊的數量。java

輸入描述

第一行是N,表示測試組數的數量,每組的輸入以下:
每組的一行是M,表示節點的個數,後續是M - 1 行的正整數n1,n2表示n1和n2之間有一條邊。node

輸出描述

每行一個輸出表示對應測試圖數據的直徑。面試

示例1

輸入算法

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,牛客:)

總覺得工做中不經常使用,就能夠不學習不鞏固了。找工做時,才發現基礎知識、基本功的重要性。
今年打算用業餘時間把數據結構、算法補一下,經常使用的、熱門的知識點和題目爭取掌握。
業精於勤荒於嬉,向認識的、勤奮的同窗好好學習,加油!

也但願早點找到合適的工做並穩定下來。


心要年輕,路還很長。

相關文章
相關標籤/搜索