摘要:作為頂級域名,常用的有,下一級則有,最低的一級為。當我們訪問域名時,也同時訪問了其父域名以及頂級域名。輸入中任意一個域名的訪問次數都小于。
前言
LeetCode上一道不算難的題目,但是一開始做的時候,執行時間很不理想,通過多次修改代碼,總算是改到比較滿意的地步。原題目如下:
解題思路一個網站域名,如"discuss.leetcode.com",包含了多個子域名。作為頂級域名,常用的有"com",下一級則有"leetcode.com",最低的一級為"discuss.leetcode.com"。當我們訪問域名"discuss.leetcode.com"時,也同時訪問了其父域名"leetcode.com"以及頂級域名 "com"。
給定一個帶訪問次數和域名的組合,要求分別計算每個域名被訪問的次數。其格式為訪問次數+空格+地址,例如:"9001 discuss.leetcode.com"。
接下來會給出一組訪問次數和域名組合的列表cpdomains 。要求解析出所有域名的訪問次數,輸出格式和輸入格式相同,不限定先后順序。
示例 1: 輸入: ["9001 discuss.leetcode.com"] 輸出: ["9001 discuss.leetcode.com", "9001 leetcode.com", "9001 com"] 說明: 例子中僅包含一個網站域名:"discuss.leetcode.com"。按照前文假設,子域名"leetcode.com"和"com"都會被訪問,所以它們都被訪問了9001次。 示例 2: 輸入: ["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" 1次,"wiki.org" 5次。 而對于父域名,會訪問"mail.com" 900+1 = 901次,"com" 900 + 50 + 1 = 951次,和 "org" 5 次。注意事項:
cpdomains 的長度小于 100。
每個域名的長度小于100。
每個域名地址包含一個或兩個"."符號。
輸入中任意一個域名的訪問次數都小于10000。
只要利用HashMap的key不會重復的特性和對String進行分割就可以快速完成這道題
實現代碼 第一版這個版本的代碼執行所用測試用例所用時間達到了94ms(由于leetcode服務器的負荷情況,不同時間段執行的所用時間可能會存在一定差異),簡直是慢到難以忍受的地步
public List第二版subdomainVisits(String[] cpdomains) { List list=new ArrayList<>(); if(cpdomains!=null){ Map map=new HashMap<>(); for(String cpdomain:cpdomains){ String[] strs=cpdomain.split(" "); int times=Integer.valueOf(strs[0]);//訪問次數 String tmp=strs[1];//域名 while(tmp.indexOf(".")!=-1){//域名中不存在點號.就結束 if(map.containsKey(tmp)){//判斷是否存在這個域名的記錄,有則累加,否則記錄下來 map.put(tmp,map.get(tmp)+times); }else{ map.put(tmp,times); } //切割域名,轉換為更高一級的域名 tmp=tmp.substring(tmp.indexOf(".")+1); } //把最頂級域名的方法次數記錄下來 if(map.containsKey(tmp)){ map.put(tmp,map.get(tmp)+times); }else{ map.put(tmp,times); } } map.forEach((k,v)->{//使用函數式編程接口BiConsumer把map轉為結果list list.add(v+" "+k); }); } return list; }
通過優化后,執行時間變成了22ms,這么大的優化只是簡單的替換了使用的API,其中優化點如下:
使用Map的getOrDefault方法代替傳統的先使用containsKey方法判斷是否存在來決定是否執行累加邏輯。這樣可以減少Map的遍歷次數。
不使用函數式編程接口,改為使用迭代器遍歷Map中的元素
public ListsubdomainVisits(String[] cpdomains) { List list=new ArrayList<>(); if(cpdomains!=null){ Map map=new HashMap<>(); for(String cpdomain:cpdomains){ int times=Integer.valueOf(cpdomain.substring(0,cpdomain.indexOf(" "))); String domain=cpdomain.substring(cpdomain.indexOf(" ")+1); while(domain.indexOf(".")!=-1){ //減少判斷是否存在的那次遍歷 map.put(domain,map.getOrDefault(domain,0)+times); domain=domain.substring(domain.indexOf(".")+1); } map.put(domain,map.getOrDefault(domain,0)+times); } //使用迭代器遍歷Map的元素 Iterator > it=map.entrySet().iterator(); while(it.hasNext()){ Map.Entry entry=it.next(); list.add(entry.getValue() + " " + entry.getKey()); } } return list; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76956.html
摘要:文章也不例外,只有提交進入正常狀態,才會進行渲染。提交并預覽首頁文章頁部署實例與子域名支持多實例,實例與網站子域名一一對應,不同實例的數據完全隔離。 介紹 Cabloy-CMS是什么 Cabloy-CMS是基于CabloyJS全棧業務開發框架開發的動靜結合的CMS,可以快速構建企業網站、博客、社區、商城等Web應用。 在線演示 https://zhennann.com 特性 Cablo...
摘要:題目鏈接題目分析題目給定一個字符串數組,每個字符串分兩部分,以空格分割。第一部分為訪問次數,第二部分為域名。要求按同樣的格式,分別返回頂級域名二級域名三級域名的訪問次數。最終代碼若覺得本文章對你有用,歡迎用愛發電資助。 811. Subdomain Visit Count 題目鏈接 811. Subdomain Visit Count 題目分析 題目給定一個字符串數組,每個字符串分兩部...
摘要:癥狀原來能正常顯示的情況下,將圖片文件改為子域名訪問,方便加速。切換之后一切正常,但是的圖片沒有正確顯示,全部顯示框框原因因為瀏覽器的安全規則,雖然是子域名,但是跨域載入字體文件的時候被瀏覽器攔截,導致了顯示不正常。解決以為例,修改或者 癥狀 原來能正常顯示的情況下,將js、css、圖片文件改為子域名訪問,方便cdn加速。切換之后一切正常,但是font-awesome的圖片沒有正確顯示...
閱讀 1382·2021-09-22 10:02
閱讀 1862·2021-09-08 09:35
閱讀 4044·2021-08-12 13:29
閱讀 2594·2019-08-30 15:55
閱讀 2257·2019-08-30 15:53
閱讀 2295·2019-08-29 17:13
閱讀 2753·2019-08-29 16:31
閱讀 2948·2019-08-29 12:24