面试题:标记出真正重复的主机名

PlutoKey
铠甲勇士 2020-09-02 字数 705

一个Excel表或Oracle表,有两个字段: 主机名(char 255)和IP地址(char 4000).

一个主机有一个或多个IP地址.

约几千条数据.

数据格式如下:

host_name ip_addr

beijing101 66.66.66.66;66.66.66.67

beijing101 66.66.66.67;66.66.66.66

beijing102 66.66.66.68;66.66.66.69

beijing102 66.66.66.70;66.66.66.71

beijing103 66.66.66.72

beijing104 66.66.66.73;66.66.66.74;66.66.66.75

......

问题:要求标记出真正重复的主机名.

比如,

beijing101 66.66.66.66;66.66.66.67

beijing101 66.66.66.67;66.66.66.66

这两行记录只是IP顺序不同,其实IP完全相同,所以是重复的主机.

结果: 这两行记录前面标记加yes

比如,

beijing102 66.66.66.68;66.66.66.69

beijing102 66.66.66.70;66.66.66.71

这两行记录虽然主机名相同,但是IP不同,所以不是重复的主机.

结果: 这两行记录前面标记加no

求解答.

Java Java技术
2 个回复
one4all4one
one4all4one 2020-09-02

读数据,分割出来主机名和后面的ip字符串,然后把ip字符串按照分号分隔后排序,按大小顺序整理一遍,保证所有的记录都这样扫一遍

然后用map保存一次,就能查重。key是整理过的主机名加字符串,value是yes(重复)或者no(不重复)

【 在 PlutoKey 的大作中提到: 】

: 一个Excel表或Oracle表,有两个字段: 主机名(char 255)和IP地址(char 4000).

: 一个主机有一个或多个IP地址.

: 约几千条数据.

: ...................

here080
hero080 2020-09-03

很基础啊。

一个主机名对应多个地址,顺序无关,也就是一个地址集合。你可以很容易地给这个地址集合一个signature,然后对比signature就能找出重复的了。

最直接的signature就是把地址排个序。

优化一下可以将所有地址加入了一个hash表,对应一个数,然后将数连接起来成一个signature.

当然,这都是假定数据量不大,内存可以搞定的算法。

否则就得上MR或者类似方法了。

【 在 PlutoKey (铠甲勇士) 的大作中提到: 】

: 标  题: 面试题:标记出真正重复的主机名

: 发信站: 水木社区 (Wed Sep  2 22:50:24 2020), 站内

: 一个Excel表或Oracle表,有两个字段: 主机名(char 255)和IP地址(char 4000).

: 一个主机有一个或多个IP地址.

: 约几千条数据.

: 数据格式如下:

: host_name ip_addr

: beijing101 66.66.66.66;66.66.66.67

: beijing101 66.66.66.67;66.66.66.66

: beijing102 66.66.66.68;66.66.66.69

: beijing102 66.66.66.70;66.66.66.71

: beijing103 66.66.66.72

: beijing104 66.66.66.73;66.66.66.74;66.66.66.75

: ......

: 问题:要求标记出真正重复的主机名.

: 比如,

: beijing101 66.66.66.66;66.66.66.67

: beijing101 66.66.66.67;66.66.66.66

: 这两行记录只是IP顺序不同,其实IP完全相同,所以是重复的主机.

: 结果: 这两行记录前面标记加yes

: 比如,

: beijing102 66.66.66.68;66.66.66.69

: beijing102 66.66.66.70;66.66.66.71

: 这两行记录虽然主机名相同,但是IP不同,所以不是重复的主机.

: 结果: 这两行记录前面标记加no

: 求解答.

: --