Google算法面试题 | 合法的IP的地址

3,097 阅读3分钟

专栏 | 九章算法
网址 | www.jiuzhang.com

题目描述

编写一个函数判断一个字符串是IPv4地址还是IPv6地址或者两者都不是。

IPv4地址以十进制格式表示,它由四个十进制数组成,每个数字范围从0到255,以点(“.”)分隔,例如172.16.254.1;

IPv6地址以十六进制格式表示,它由八个四位的十六进制数组成,以冒号(“:”)分隔,例如:

2001:0db8:85a3:0000:0000:8a2e:0370:7334就是合法的 IPv6地址。

同时,我们可以省略一些前导零或者把字母以大写字母表示,所以2001:db8:85a3:0:0:8A2E:0370:7334也是合法的IPv6地址。但是不能完全省略0值,比如2001:0db8:85a3::8A2E:0370:7334就不是合法的IPv6地址。

多余的前导零也是不合法的,比如02001:0db8:85a3:0000:0000:8a2e:0370:7334。

你可以假设输入没有额外的空格和特殊符号。

样例说明

样例1:
输入: "172.16.254.1"
输出: "IPv4"
样例解释: 这是一个IPv4地址,返回"IPv4".

样例2:
输入: "2001:0db8:85a3:0:0:8A2E:0370:7334"
输出: "IPv6"
样例解释: 这是一个IPv6地址,返回"IPv6".

样例3:
输入: "256.256.256.256"
输出: "Neither"
样例解释: 这既不是IPv4地址也不是IPv6地址,返回"Neither"

解题思路

a.这题是一题字符串处理的题目,题目要求我们判断一个字符串是不是合法的IPv4或IPv6字符串。

我们可以把分别考虑这个字符串是不是IPv4字符串或IPv6字符串。

b.判断一个字符串是不是IPv4字符串比IPv6稍难。

我们从IPv4的特点入手:由4段数字组成,其中有三个'.'符号,每个数字的范围都在0~255之间,且每个数都是合法的数字(没有前导零)。

所以我们可以先把这个字符串用‘.'分隔开,再统计一下'.'的个数,最后判断每个数字是否合法即可。

需要注意的是IPv4字符串的每一个数字不允许存在前导0,但是单个的0是允许的。

c.判断IPv6的思路和IPv4类似,拆分并且判断分隔符的个数,依次检查每个数的正确性。

IPv6的地址不需要判断前导零,但是需要注意大小写都是合法的。

参考代码

面试官角度

这题主要考察字符串处理和corner case的处理能力,题目的要求需要仔细阅读,每一个细节都需要仔细处理。如果能做到bug free,就能获得较高的评价。

lintcode相关题目

有效数字
www.lintcode.com/zh-cn/probl…

转换字符串到整数
www.lintcode.com/zh-cn/probl…

九章参考代码链接

www.jiuzhang.com/solution/va…


推荐阅读:



欢迎关注我的微信公众号:九章算法(ninechapter)。
精英程序员交流社区,定期发布面试题、面试技巧、求职信息等

九章算法,IT教育领域的深耕者
九章算法,IT教育领域的深耕者