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