算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
今天和大家聊的问题叫做 验证IP地址,我们先来看题面:
https://leetcode-cn.com/problems/validate-ip-address/
示例 1:
输入:IP = "172.16.254.1"
输出:"IPv4"
解释:有效的 IPv4 地址,返回 "IPv4"
示例 2:
输入:IP = "2001:0db8:85a3:0:0:8A2E:0370:7334"
输出:"IPv6"
解释:有效的 IPv6 地址,返回 "IPv6"
示例 3:
输入:IP = "256.256.256.256"
输出:"Neither"
解释:既不是 IPv4 地址,又不是 IPv6 地址
https://www.freesion.com/article/5594817898/
思路是这样的:
1.先判断是不是ipv4。
没有“.”的不是;把整个字符串以“.”分开,不是四段的不是,凡是有某一段长度大于3或者为0的不是;每一段数字判断段大小(0-255)同时判断有没有多余的前0。
2.再判断是不是ipv6
先转小写字母。没有“:”的不是;(除了“:”)出现不是数字或者不是a-f字符的不是;以“:”分开成若干段,不是8段的不是;每段长度大于4的不是。
class Solution {
public String validIPAddress(String IP) {
if(isIp4(IP)){return "IPv4";}
if(isIp6(IP)){return "IPv6";}
return "Neither";
}
public boolean isIp4(String ip){
ip=ip.trim();
if(ip.contains(".")){
for(int i=0;i<ip.length();i++){
char c=ip.charAt(i);
if(c!='.'&&!Character.isDigit(c)){return false;}
}
String ip4[]=ip.split("\\.",-1);//-1表示末尾开头的到的叶算,跟进空字符串
if(ip4.length!=4){return false;}//ip4的是4段数
for(int i=0;i<4;i++){
int l=ip4[i].length();
if(l==0||l>3){return false;}//注意空数字,判断32位超范围
int shu=Integer.parseInt(ip4[i]);
if(shu>255||(shu<10&&l>1)||(shu<100&&l>2)){
//每个数字开头不能是0,除非就是0
return false;
}
}
}
else{return false;}
return true;
}
public boolean isIp6(String ip){
ip=ip.trim().toLowerCase();//防止大小写混用
if(ip.contains(":")){
for(int i=0;i<ip.length();i++){
char c=ip.charAt(i);
if(c!=':'&&!(c>='0'&&c<='9')&&!(c>='a'&&c<='f')){
return false;
}
}
String[] ip6=ip.split("\\:",-1);
if(ip6.length!=8){return false;}
for(int i=0;i<8;i++){
//ip6要有8段
int l=ip6[i].length();
if(l==0||l>4){return false;}//if(l>4){return false;}
}
}
else{return false;}
return true;
}
}
好了,今天的文章就到这里 。