U面经Prepare: Web Address
题目是给你一堆域名,其中一些是另一些的parent,比如.com是.youku.com的parent,然后.youku.com是.service.youku.com的parent这样,然后再给你一个网址,让你在那堆域名中找到这个网址的parent里面最长的一个,然后再往前退一个返回。语言有点不好描述,举个栗子: Domains:[
“.com”,
“.cn”
“.service.com”
“.net”
“.youku.net”
]
.
url: “yeah.hello.youku.net” 这里.net和.youku.net都是这个url的parent,其中最长的是.youku.net,再往前退一个是hello,所以返回“hello.youku.net”
虽然我觉得这道题用set倒着来就可以解决,但是看到一个Trie的做法也很不错
这里TrieNode.val不再是char, 而是String. children array也变成了Map<String, TrieNode>
public class LongestSubDomain {
private class TrieNode {
String str;
Map<String, TrieNode> map;
boolean isLeaf;
public TrieNode(String str) {
this.str = str;
this.map = new HashMap<>();
this.isLeaf = false;
}
}
TrieNode root = new TrieNode("#");
public static void main(String[] args) {
LongestSubDomain lsd = new LongestSubDomain();
String[] domains = {".com", ".cn", ".service.com", ".net", ".youku.net"};
String url = "yeah.hello.youku.net";
for (String str : domains) {
lsd.insert(str);
}
String res = lsd.startWith(url);
System.out.println(res);
}
public void insert(String domain) {
String[] temp = domain.split("\\.");
TrieNode node = root;
for (int i = temp.length - 1; i >= 0; i--) {
if (temp[i].length() == 0) continue;
if (node.map.containsKey(temp[i])) {
node = node.map.get(temp[i]);
} else {
TrieNode newNode = new TrieNode(temp[i]);
node.map.put(temp[i], newNode);
node = newNode;
}
}
node.isLeaf = true;
}
public String startWith(String url) {
String[] temp = url.split("\\.");
TrieNode node = root;
String res = "";
int index = temp.length - 1;
for (int i = temp.length - 1; i >= 0; i--) {
if (temp[i].length() == 0) continue;
if (node.map.containsKey(temp[i])) {
res = "." + temp[i] + res;
node = node.map.get(temp[i]);
} else {
if (!node.isLeaf) {
res = "";
} else {
index = i;
}
break;
}
}
return temp[index] + res;
}
}
我的做法:
package uberOnsite;
import java.util.*;
public class LongestParent {
public class TrieNode {
String val;
Map<String, TrieNode> children;
boolean end;
public TrieNode(String str) {
val = str;
children = new HashMap<String, TrieNode>();
end = false;
}
}
TrieNode root = new TrieNode("");
public void insert(String str) {
String[] arr = str.split("\\.");
TrieNode node = root;
for (int i=arr.length-; i>=; i--) {
if (arr[i].length() == ) continue;
if (!node.children.containsKey(arr[i])) {
node.children.put(arr[i], new TrieNode(arr[i]));
}
node = node.children.get(arr[i]);
}
node.end = true;
}
public String findLongest(String str) {
String[] input = str.split("\\.");
TrieNode node = root;
StringBuffer res = new StringBuffer();
for (int i=input.length-; i>=; i--) {
String cur = input[i];
if (node.children.containsKey(cur)) {
res.insert(, cur);
res.insert(, ".");
node = node.children.get(cur);
}
else {
res.insert(, cur);
return res.toString();
}
}
return "";
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
LongestParent sol = new LongestParent();
String[] domains = {".com", ".cn", ".service.com", ".net", ".youku.net"};
String url = "yeah.hello.youku.net";
for (String each : domains) {
sol.insert(each);
}
String res = sol.findLongest(url);
System.out.println(res);
}
}
U面经Prepare: Web Address的更多相关文章
- VS Extension: Open Web Address with Visual Studio Browser
使用VS 打开链接 using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop; ... public ...
- Some web Address
1.可视化算法(Data Structure Visualizations) https://www.cs.usfca.edu/~galles/visualization/Algorithms.htm ...
- SharePoint 2013 创建web应用程序报错"This page can’t be displayed"
错误描述 This page can’t be displayed •Make sure the web address http://centeradmin is correct. •Look fo ...
- ASP.NET Web API 实例
ASP.NET Web API 入门大杂烩 创建Web API解决方案,命名为VCoinWebApi,并且创建了同名的Project,然后,创建一个Empty Project:Models,创建一个W ...
- Understanding Responsive Web Design: Cross-browser Compatibility
http://www.sitepoint.com/understanding-responsive-web-design-cross-browser-compatibility/ In the las ...
- SharePoint 2013 创建web应用程序报错"This page can’t be displayed"
错误描写叙述 This page can't be displayed •Make sure the web address http://centeradmin is correct. •Look ...
- kubernetes使用Traefik暴露web服务-转载51cto
Traefix介绍(摘自网络) traefik 是一个前端负载均衡器,对于微服务架构尤其是 kubernetes 等编排工具具有良好的支持:同 nginx 等相比,traefik 能够自动感知后端容器 ...
- Accepting PayPal in games(完整的Paypal在Unity的支付)
Hello and welcome back to my blog! In this article I’m going to talk about the process of acceptin ...
- CentOS6.5上Zabbix3.0的RPM安装【一】-安装并配置Server
一.Environment OS:CentOS6.5 64bit [桌面版安装] Server端:192.168.201.109 ServerName Clinet端:192.168.201.199 ...
随机推荐
- flask狗书
Models.py #coding:utf8 fromflaskimportFlask fromflask_sqlalchemyimportSQLAlchemy app=Flask(__name__) ...
- webpack 打包测试和生产多个版本
cross-env修改生产环境变量 npm i --save-dev cross-env 在package.json里这么配置 npm run build就是打包到生产环境 npm run build ...
- 最近公共祖先问题(LCA)的几种实现方式
LCA也是很经典的内容了,我这个蒟蒻居然今天才开始弄QAQ 我太弱啦! 照例先上定义——————转自维基百科 在图论和计算机科学中,最近公共祖先是指在一个树或者有向无环图中同时拥有v和w作为后代的最深 ...
- 有关svn的报错
由于目标计算机积极拒绝,无法连接.当报出这样的错的时候就是跨域的问题
- __x__(16)0906第三天__层叠样式表CSS简介
层叠样式表CSS Cascading Style Sheets 用来为网页创建样式表,通过样式表对网页进行装饰. 所谓层叠,就是将网页想象成一层一层的结构,层次高的将覆盖层次低的. CSS可以为网页的 ...
- ArcGIS Construction Tool OnSketchFinished事件不响应
使用ArcGIS AddIN ConstructionTool做东西,绘制完Sketch之后,OnSketchFinished事件不响应,没有任何异常与错误. 1.初步问题:OnSketchFinis ...
- linux下利用C或C++ 语言调用需要root权限的函数
1.setuid法(1)登录root用户,将程序设置成root:root所有者(等价于:登录root用户编译程序).也可直接将普通用户加入root组中,那么编译程序不用来回切换用户.(2)登录root ...
- 修改MyEclipse字体大小及颜色
windows-->prefereces->General-->Appearance-->Colors and Fonts,在右边找到要修改的字体或背景,双击点Edit修改即可 ...
- connection reset by peer
connection reset by peer https 请求返回下面的内容 {"msg":"connection reset by peer"," ...
- sort 用法
Sort函数有三个参数: (1)第一个是要排序的数组的起始地址. (2)第二个是结束的地址(最后一位要排序的地址) (3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数 ...