周三去B商搜面试,连着面了三面,对体力也是一个不小的考验,三面也是技术面,其中代码题为判断字符串是否为合法IP
之前IP的题写过32位int转换为IP的,还好数字串判断是否能成为IP的DFS,字符串判断IP的还没遇见过
经过思考之后,先确定方向,是一道字符串处理的题,合法ip的话主要有以下几点:
1.合法IP只有'.'和'1-9'其他的字符都干掉
2.IP串为四个数字3个'.'不符合的干掉
3.连续的'..'干掉
4.数字在0-255以外的干掉
5.非0数字前有0的也干掉
然后开始手写,之前写的时候没考虑到010的情况,后来发现了加了一个逻辑判断,总的来说思路没啥问题,附上代码:
bool isValidIP(char* str){
if (NULL==str)
{
return false;
}
bool preIsNum=false;
int numOfPoint=0;
int numOfNum=0;
char *p=str;
while ('\0'!=*p&&numOfPoint<=3&&numOfNum<=4)
{
if('.'!=*p&&(*p<'0'||*p>'9')){
return false;
}
if('.'==*p){
if (!preIsNum)
{
return false;
}
else
{
preIsNum=false;
numOfPoint++;
}
p++;
}
else{
int tmp=0;
bool prevHasZero=0;
while ('\0'!=*p&&*p>='0'&&*p<='9')
{
if (prevHasZero==true)
{
return false;
}
if (*p=='0'&&tmp==0)
{
prevHasZero=true;
}
tmp=tmp*10+(*p-'0');
p++;
}
if (tmp<0||tmp>255)
{
return false;
}
numOfNum++;
preIsNum=true;
}
}
if (numOfPoint==3&&numOfNum==4)
{
return true;
}
else{
return false;
}
}
附上检查代码和结果:
int main(){
char a[][10] ={"0","000000"};
char *b[] ={"","a","000","0.123.456.2","000.000.0.0",".0.0.3.2",".0.0.0.0","1.1.256.1","1.2.a.2","00.0.0.0","0.00.0.0","010.010.010.010"};
char *c[] ={"0.0.0.0","1.1.1.1","100.100.100.100","255.255.255.255"} ;
ofstream outfile;
outfile.open("out.txt");
cout<<setw(20)<< setiosflags(ios::left)<<"无效IP"<<setw(20)<<"判断结果"<<endl;
outfile<<setw(20)<< setiosflags(ios::left)<<"无效IP"<<setw(20)<<"判断结果"<<endl;
for (int i=0;i<sizeof(b)/sizeof(b[0]);i++)
{
cout<<setw(20)<< setiosflags(ios::left)<<b[i]<<setw(20)<<isValidIP(b[i])<<endl;
outfile<<setw(20)<< setiosflags(ios::left)<<b[i]<<setw(20)<<isValidIP(b[i])<<endl;
}
cout<<setw(20)<< setiosflags(ios::left)<<"有效IP"<<setw(20)<<"判断结果"<<endl;
outfile<<setw(20)<< setiosflags(ios::left)<<"有效IP"<<setw(20)<<"判断结果"<<endl;
for (int i=0;i<sizeof(c)/sizeof(c[0]);i++)
{
cout<<setw(20)<< setiosflags(ios::left)<<c[i]<<setw(20)<<isValidIP(c[i])<<endl;
outfile<<setw(20)<< setiosflags(ios::left)<<c[i]<<setw(20)<<isValidIP(c[i])<<endl;
}
outfile.close();
}