现在的位置: 首页 > 综合 > 正文

HDOJ 2206:IP的计算 这道题的边界条件可以挑战你的想象力

2018年05月25日 ⁄ 综合 ⁄ 共 1138字 ⁄ 字号 评论关闭

    这道题目跟我去雷军的小米科技三面的一道面试题有些类似,现在想起来当时并没有对边界条件做过多的考虑。

    这道题目的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;
}


 

抱歉!评论已关闭.