Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update 13.第十三题.md #16

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions 算法集合/13.第十三题.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@
## 考察目标
首先这个算法题目在面试中我用亲身遇到过,从面试经历中来看面试官出这道题的目的主要是为了考察对边界限制条件的考察和相关边界条件的考察,归纳一下的话就是简单的一个字符串的处理。

## 题目分析
我们应该知道IP的格式(具体呈现的规律要有一个总结,不能仅自己知道,需要具体),形式具体如下:(0~255).(0~255).(0~255).(0~255)。一共有4个数块(或者字符块)括号中给出了相关限制,然后一共有3个点(英文半角)那么由此可见可以有两种方法实现,一种是基于对字符串的处理,另一种是通过强大的正则表达式来判断,通过上面的考察目标可知面试官更倾向于你编写之前的这种,后者如果你写了只能体现你对你所使用的这种语言正则库的熟悉并不会很浓墨重彩的体现你的筛选思想
## 题目分析
我们应该知道IP的格式(具体呈现的规律要有一个总结,不能仅自己知道,需要具体),形式具体如下:(0-255).(0-255).(0-255).(0-255)。一共有4个数块(或者字符块)括号中给出了相关限制,然后一共有3个点(英文半角)那么由此可见可以有两种方法实现,一种是基于对字符串的处理,另一种是通过强大的正则表达式来判断,通过上面的考察目标可知面试官更倾向于你编写之前的这种,后者如果你写了只能体现你对你所使用的这种语言正则库的熟悉并不会很浓墨重彩的体现你的筛选思想

## 限制条件分析
- 输入的字符串为空则返回 false
- 算上 “.” 分隔符超过了总的最大长度或者小雨最短长度返回 false
## 限制条件分析
- 输入的字符串为空则返回 false
- 算上 “.” 分隔符超过了总的最大长度或者小雨最短长度返回 false
- 分割后每个小块总数不等于 4 返回 false
- 分割后每个小块中必须也只能是 0~9 的数字,别的字符违法
- 分割后的每个小块数值必须在 0~255 之间
Expand All @@ -29,7 +29,7 @@
using namespace std;
using namespace boost;

//字符串分割函数
//字符串分割函数
// vector<string> split(string str,string pattern)
// {
// string::size_type pos;
Expand All @@ -48,19 +48,19 @@ using namespace boost;
// }
// return result;
// }
//当然这个地方自己写的分割函数肯定是没有哪些很成熟的第三方的库函数写的好的,所以这个地方的话最好还是用boost库,其中就包含有split函数,当然了如果你是用的Java写的这个面试题目那就可以直接调用库函数
//当然这个地方自己写的分割函数肯定是没有哪些很成熟的第三方的库函数写的好的,所以这个地方的话最好还是用boost库,其中就包含有split函数,当然了如果你是用的Java写的这个面试题目那就可以直接调用库函数

bool isIPAddressValid(const string &IPAddr)
{
//限制条件1
//限制条件1
if(IPAddr == NULL){
return false;
}
//限制条件2
if(IPAddr.length()<7 || IPAddr.length>15){
return false;
}
//限制条件3,过滤分割输入后的不正常长度
//限制条件3,过滤分割输入后的不正常长度
vector<string> store;
spilt(store,IPAddr,is_any_of(".");
if(store.size() != 4){
Expand Down Expand Up @@ -110,4 +110,4 @@ int main(void){

## 总结

尽管这道题目考察的是对 IP 字符串的筛选方法,但是值得注意的是这个地方的对字符串的分割十分的重要,因为一开始 C++ 并不像 Java 有这个成员函数,所以在转换的时候就是想的是分割出来的一串相邻之间用空格分开即可,但是这个就很不方便我们后面的处理了,看了第三方库函数对分割函数的处理才发现,嗯确实分割之后应该是放在已经容器当中的,这样存取方便(顿时感觉学 vector(或者说容器) 血赚)然后还有一个就是在第 4 个限制条件当编写当中时需要针对每个小块当中的数字进行分析即需要将 string 转换成为 char* 方便比较,C++ 的这个 string 这个地方就很蛋疼,别的基本上都很好理解很限制。对于正则表达式的这种写法,建议大家可以用别的语言试试,比如 Python 什么的,还是很便捷的。
尽管这道题目考察的是对 IP 字符串的筛选方法,但是值得注意的是这个地方的对字符串的分割十分的重要,因为一开始 C++ 并不像 Java 有这个成员函数,所以在转换的时候就是想的是分割出来的一串相邻之间用空格分开即可,但是这个就很不方便我们后面的处理了,看了第三方库函数对分割函数的处理才发现,嗯确实分割之后应该是放在已经容器当中的,这样存取方便(顿时感觉学 vector(或者说容器) 血赚)然后还有一个就是在第 4 个限制条件当编写当中时需要针对每个小块当中的数字进行分析即需要将 string 转换成为 char* 方便比较,C++ 的这个 string 这个地方就很蛋疼,别的基本上都很好理解很限制。对于正则表达式的这种写法,建议大家可以用别的语言试试,比如 Python 什么的,还是很便捷的。