题解 | #合法IP#
合法IP
http://www.nowcoder.com/practice/995b8a548827494699dc38c3e2a54ee9
题目的主要信息:
根据题目,我们判断ip地址是否合法,判断是否合法的检查标准是每段数字的范围在0-255。
方法一:
从字符串中提取出四段数字,然后判断每个数字是否在0-255之间,如果有一个数字越界了,那这个ip地址就是非法的。 具体做法:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main()
{
string str;
while(getline(cin,str))
{
stringstream ss(str);
string temp;
bool flag=true;
int count=0;//用于统计部分数
while(getline(ss,temp,'.'))
{
int num=atoi(temp.c_str());
if((num!=0&&temp[0]=='0')||!isdigit(temp[0])){//每一部分不能含有其他符号
flag=false;
}else{
if(num>255||num<0){
flag=false;
break;
}
count++;
}
}
if(flag&&(count==4)) cout<<"YES"<<endl;//有四个部分且每一部分数字合法
else cout<<"NO"<<endl;
}
return 0;
}
复杂度分析:
- 时间复杂度:,每检查一个ip地址,只判断四段数字的范围是否合法,只需常数时间。
- 空间复杂度:,只用了常数空间。
方法二:
直接用正则表达式匹配。
具体做法:
#include<iostream>
#include<string>
#include<regex>
using namespace std;
int main(){
string str;
regex pattern("((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)\.){3}((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d))");//匹配0.0.0.0-255.255.255.255的正则表达式
while(getline(cin, str)){
if(regex_match(str, pattern)){//正则表达式匹配成功
cout << "YES" << endl;
}else{
cout << "NO" << endl;
}
}
return 0;
}
复杂度分析:
- 时间复杂度:,用正则表达式匹配只需常数时间。
- 空间复杂度:,只用了常数空间。