1、问题描述
编写一个函数判断一个字符串是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。
你可以假设输入没有额外的空格和特殊符号。
2、样例说明
样例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"
3、解题思路
a.这题是一题字符串处理的题目,题目要求我们判断一个字符串是不是合法的IPv4或IPv6字符串。
我们可以把分别考虑这个字符串是不是IPv4字符串或IPv6字符串。
b.判断一个字符串是不是IPv4字符串比IPv6稍难。
我们从IPv4的特点入手:由4段数字组成,其中有三个'.'符号,每个数字的范围都在0~255之间,且每个数都是合法的数字(没有前导零)。
所以我们可以先把这个字符串用‘.'分隔开,再统计一下'.'的个数,最后判断每个数字是否合法即可。
需要注意的是IPv4字符串的每一个数字不允许存在前导0,但是单个的0是允许的。
c.判断IPv6的思路和IPv4类似,拆分并且判断分隔符的个数,依次检查每个数的正确性。
IPv6的地址不需要判断前导零,但是需要注意大小写都是合法的。
4、参考代码
5、面试官角度
这题主要考察字符串处理和corner case的处理能力,题目的要求需要仔细阅读,每一个细节都需要仔细处理。如果能做到bug free,就能获得较高的评价。
6、lintcode相关题目
有效数字
http://www.lintcode.com/zh-cn/problem/valid-number/
转换字符串到整数
http://www.lintcode.com/zh-cn/problem/string-to-integer-ii/
7、九章参考代码链接
http://www.jiuzhang.com/solution/validate-ip-address/
专业的北美IT求职经验分享,技术交流社区,帮助你找到好的IT工作。
由硅谷顶尖的IT企业工程师授课,提供专业的算法培训/面试咨询。
官网:www.jiuzhang.com
*九章算法。
知乎ID:九章算法。