专栏 | 九章算法
网址 | 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…
九章参考代码链接
推荐阅读:
- 《北美IT企业fulltime薪资大曝光》
- 《IT 简历模板大放送 | 《如何写好技术简历》讲座精华总结》
- 《offer收割机的求职秘诀 | <如何成为offer达人>讲座精华总结》
- 《Google offer 如何谈判?听听 Google recruiter 怎么说!》
- 《面试遇到做过的题怎么办?》
- 《冷冻期大揭秘 | Google、FB、Amazon、Linkedin冷冻期》
- 《面试前如何了解一家IT企业?试试官方技术博客!》
- 《北美IT企业intern薪资大曝光》
- 《16个behavior question 的面试官解析及tips》
- 《Google晋升机制 | 大公司如何升级打怪, 获得晋升?》
欢迎关注我的微信公众号:九章算法(ninechapter)。
精英程序员交流社区,定期发布面试题、面试技巧、求职信息等