LeetCode算法題-Subdomain Visit Count(Java實現)

這是悅樂書的第320次更新,第341篇原創

算法

01 看題和準備

今天介紹的是LeetCode算法題中Easy級別的第189題(順位題號是811)。像「discuss.leetcode.com」這樣的網站域名由各類子域組成。在頂級,咱們有「com」,在下一級,咱們有「leetcode.com」,在最低級別,「discuss.leetcode.com」。當咱們訪問像「discuss.leetcode.com」這樣的域名時,咱們也會隱含地訪問父名「leetcode.com」和「com」。數組

如今,將「計數配對域名」稱爲計數(表示此域收到的訪問次數),後跟空格,後跟地址。計數配對域名的示例能夠是「9001 discuss.leetcode.com」。數據結構

給出了計數配對域名的cpdomains數組,以相同的格式,返回全部域名和訪問次數組成的字符串數組。例如:


輸入:[「9001 discuss.leetcode.com」]dom

輸出:[「9001 discuss.leetcode.com」,「9001 leetcode.com」,「9001 com」]eclipse

說明:咱們只有一個網站域名:「discuss.leetcode.com」。如上所述,還將訪問子域「leetcode.com」和「com」。因此他們將被訪問9001次。


輸入:[「900 google.mail.com」,「50 yahoo.com」,「1 intel.mail.com」,「5 wiki.org」]工具

輸出:[「901 mail.com」,「50 yahoo.com」,「900 google.mail.com」,「5 wiki.org」,「5 org」,「1 intel.mail.com」,「951 com」]開發工具

說明:咱們將訪問「google.mail.com」900次,「yahoo.com」訪問50次,「intel.mail.com」訪問一次,「wiki.org」訪問5次。對於子域名,咱們將訪問「mail.com」900 + 1 = 901次,「com」900 + 50 + 1 = 951次,以及「org」5次。


注意測試

  • cpdomains的長度不會超過100。網站

  • 每一個域名的長度不超過100。google

  • 每一個地址都有1或2個「.」字符。

  • 任何計數配對域名中的訪問次數不會超過10000。

  • 答案輸出能夠按任何順序返回。

本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。

02 解題

每一個域名加訪問次數組成的字符串,根據域名中的點號,能夠分爲兩種狀況:

(1)域名中只有一個點號時,能夠拆分紅兩個新的字符串,一是訪問次數加最後面的頂級域名,二是訪問次數加域名自己。

(2)域名中有兩個點號時,能夠拆分紅三個新的字符串,一是訪問次數加最後面的頂級域名,二是訪問次數加第二級域名加頂級域名,三是訪問次數加域名自己。

而頂級域名或者二級域名加頂級域名可能會重複出現,可是點擊次數要進行累加,因此藉助HashMap來存儲數組,key爲域名,value爲訪問次數。

總體思路是遍歷cpdomains數組,拆分每一組計數配對域名,存入HashMap中,遍歷HashMap存入List中,返回List。

public List<String> subdomainVisits(String[] cpdomains) {
    List<String> list = new ArrayList<String>();
    HashMap<String, Integer> map = new HashMap<String, Integer>();
    for (String str : cpdomains) {
        // 根據空格進行第一次拆分
        String[] arr = str.split(" ");
        // 對第一次拆分的結果以點號進行二次拆分
        String[] arr2 = arr[1].split("\\.");
        // 第一次拆分中,域名的訪問次數
        int count = Integer.valueOf(arr[0]);
        String current = "";
        int n = arr2.length-1;
        // 從後往前遍歷第二次拆分的結果,存入HashMap
        for (int i=n; i >= 0; i--) {
            current = arr2[i] + (i<n ? "." : "") + current;
            map.put(current, map.getOrDefault(current, 0)+count);
        }
    }
    for (String key : map.keySet()) {
        list.add(map.get(key)+" "+key);
    }
    return list;
}


03 小結

算法專題目前已日更超過五個月,算法題文章189+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。

以上就是所有內容,若是你們有什麼好的解法思路、建議或者其餘問題,能夠下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!

相關文章
相關標籤/搜索