这道题目跟我去雷军的小米科技三面的一道面试题有些类似,现在想起来当时并没有对边界条件做过多的考虑。
这道题目的URL:http://acm.hdu.edu.cn/showproblem.php?pid=2206
自己总结起来,一个合法的IP表达式应该满足下面几个条件。
1.每个ip小节的值不应该超过255,此外每个小节的字数都不能多于四个,
356.1.1.1
0356.1.1.1
都是不合法的。
2.只能出现四个ip小节,
1.1.1
1.1.1.
3.点号只能出现3次
1.1.1
1.1.1.1.
4.显然不能出现数字和点号之外的字符。
啊,做完这道题目之后,感慨颇深,太考验想象力了,字符处理起来还很需要一些技巧。贴一下我的AC代码,和大家分享一下,欢迎拍砖。
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
const int Max = 110;
char ip[Max];
int main()
{
int cur;
bool legal;
bool numPro;
int dotNum;
int nodeNum;
int curNum;
while(cin.getline(ip, Max))
{
int len = strlen(ip);
cur = 0;
legal = true;
numPro = false;
dotNum = 0;
nodeNum = 0;
curNum = 0;
for(int i=0; i<=len; i++)
{
if(ip[i] >= '0' && ip[i] <= '9')
{
cur = cur * 10 + ip[i] - '0';
numPro = true;
curNum ++;
if(cur > 255)
{
legal = false;
break;
}
if(curNum > 3)
{
legal = false;
break;
}
}
else if(ip[i] == '.')
{
if(numPro)
{
nodeNum++;
numPro = false;
}
cur = 0;
dotNum ++;
curNum = 0;
if(dotNum > 3)
{
legal = false;
break;
}
}
else if(i == len)
{
if(cur > 255)
{
legal = false;
}
if(numPro) nodeNum ++;
if(dotNum != 3) legal = false;
if(nodeNum != 4) legal = false;
}
else
{
legal = false;
break;
}
}
if(legal) cout << "YES" << endl;
else cout << "NO" << endl;
}
system("pause");
return 0;
}