力扣468验证IP地址C++判断合法IP字符串

news2024/11/22 5:51:26

目录

    • 前言
    • 题目描述
    • 解题思路
      • 主功能函数分类大框架
      • 判断IPv4是否合法
      • 判断IPv6是否合法
      • 其余小边界条件(调试后得)
    • 完整代码

前言

这是一道常见的笔试面试题,我找实习已经碰到两次了,和矩阵的乘法出现频率一样高,你校招要是全程没遇到可以过来打我;(这道题大厂面试笔试也很常见);

同时,评论区很多人吐槽这种题目是烂题,觉得debug很烦,边界很烦,条件太多,我笑了,等你真正进入公司,参与实际业务中的debug,那么debug的奥秘就能很好地从这道题中体现出来;

而什么DP 贪心之类的纯算法一年到头可能用不到几次;(刷题别刷魔怔了)

题目描述

在这里插入图片描述

请务必注意做笔试题时的好习惯,看下输入数据的范围! 这道题中,也就是提示部分;

解题思路

主功能函数分类大框架

在做着这种字符串处理问题的时候,得找技巧,比如说标记位之类的,可以把大问题按模块清晰整理整多个小问题;

这道题让判断是ipv4还是ipv6还是都不是Neither,那么简单粗暴,直接根据ipv4或者ipv6独有的特征,进入看看规则是否完全匹配即可;

(这里独有的特征可以从提示中得出,ipv4–>. ipv6–>: )

for(auto&c:queryIP){//根据协议特征,进入判断是否完全匹配这个协议
            if(c == '.') return Ipv4(queryIP);
            if(c == ':') return Ipv6(queryIP);
        }

提示字符串只由**英文字母,数字,. 和 : **组成;

怎么按照特定的字符’.'或者‘:’分割成若干子串参考我的这篇博客,当然你乐意可以写一个分割功能的子函数,就是有点麻烦了;


判断IPv4是否合法

那么在判断ipv4中,我们需要判断分割出来的子串部分: 1. 有没有前导0; 2. 有没有出现字母; 3.数字的值是否在0~255之间; 4. 分割出来子串个数是否是4个;

string Ipv4(string s)
    {

        int len = s.size();
        int n = 0;
        for(int i = 0;i<len;i++){
             if(s[i]!='.'&&(s[i]<'0'||s[i]>'9')) return "Neither";//如果出现字母,那么非法
            
            if(i<len-1&&s[i] == s[i+1]&&s[i] == '.') return "Neither";//边界条件,如果两个..出现在一起显然是非法的,我们这个逻辑会这个非法们当成‘ ’分割的时候忽略(直接想不到,调试直接发现的)
            
            if(s[i]=='.') s[i] = ' ';  //为了下面stringstream 默认以' ' 分割(注意这条语句需要放在循环最后,否则提前改了'.'可能影响上面两个if的判断)     
        }

        stringstream ss;
        ss<<s;
        string tmp;
        while(ss>>tmp)//每轮的tmp为分割出来的子串
        {
            n++;//记录子串总数
            
            if(tmp.size()!=1&&tmp[0]=='0'){//有没有前导0?
                return "Neither";
            }

            int itmp = atoi(tmp.c_str());//子串对应数字是否在0~255
            if(itmp<0||itmp>255){
                return "Neither";
            }
        }
    
        if(n==4) return "IPv4";//子串总数需要==4
        return "Neither";
    }

判断IPv6是否合法

那么在判断ipv6中,我们需要判断分割出来的子串部分: 1. 有没有出现f/F之后的字母; 2.子串单位长度是否在1~4; 3. 分割出来子串个数是否是8个;

string Ipv6(string s)
    {
        int n = 0;
        int len = s.size();
        for(int i = 0;i<len;i++){

            if(s[i]!=':'&&((s[i]>'f'&&s[i]<='z')||(s[i]>'F'&&s[i]<'Z'))) return "Neither";//判断有没有f/F之后的字母
            if(i<len-1&&s[i] == s[i+1]&&s[i] == ':') return "Neither";//边界条件,如果两个:: 出现在一起显然是非法的,我们这个逻辑会把这个非法当成‘空格 ’分割的时候忽略(直接想不到,调试直接发现的)
            if(s[i]==':') s[i] = ' ';  //为了下面stringstream 默认以' ' 分割(注意这条语句需要放在循环最后,否则提前改了'.'可能影响上面两个if的判断)     

        }
        string tmp;
        stringstream ss;
        ss<<s;
        while(ss>>tmp)//每轮的tmp为分割出来的子串
        {
            n++;//记录子串总数
            int tlen = tmp.size();
            if(tlen>4) return "Neither";//判断子串单位长度是否1~4
            
        }

        if(n == 8)return "IPv6";//子串总数需要==8
        return "Neither";
    }

其余小边界条件(调试后得)

空串直接return 非法

注意到了上面俩边界条件都是我们用stringstream分割子串的问题,还有个问题就是分隔符’.‘和’:'不可以出现在首位,这个非法我们也会忽略,所以需要拉出去讨论;

string validIPAddress(string queryIP) {
      	
        int len = queryIP.size();
        if(len == 0) return"Neither";//空串防止下面越界
        
        if(queryIP[len-1]==':'||queryIP[len-1]=='.'||queryIP[0]=='.'||queryIP[0]==':') return "Neither";//边界,如果首位有分隔符则不符合规则(直接想不到,调试直接发现的) 
        
        for(auto&c:queryIP){//根据协议特征,进入判断是否完全匹配这个协议
            if(c == '.') return Ipv4(queryIP);
            if(c == ':') return Ipv6(queryIP);
        }
        return "Neither";  
    }

完整代码

class Solution {
public:
    string Ipv4(string s)
    {

        int len = s.size();
        int n = 0;
        for(int i = 0;i<len;i++){
             if(s[i]!='.'&&(s[i]<'0'||s[i]>'9')) return "Neither";
             if(i<len-1&&s[i] == s[i+1]&&s[i] == '.') return "Neither";
             if(s[i]=='.') s[i] = ' ';       
        }
        stringstream ss;
        ss<<s;
        string tmp;
        while(ss>>tmp)
        {
            n++;
            if(tmp.size()!=1&&tmp[0]=='0'){
                return "Neither";
            }
            int itmp = atoi(tmp.c_str());
            if(itmp<0||itmp>255){
                return "Neither";
            }
        }
        if(n==4) return "IPv4";
        return "Neither";
    }
    string Ipv6(string s)
    {
        int n = 0;
        int len = s.size();
        for(int i = 0;i<len;i++){

            if(s[i]!=':'&&((s[i]>'f'&&s[i]<='z')||(s[i]>'F'&&s[i]<'Z'))) return "Neither";
            if(i<len-1&&s[i] == s[i+1]&&s[i] == ':') return "Neither";
            if(s[i]==':') s[i] = ' ';  
        }
        string tmp;
        stringstream ss;
        ss<<s;
        while(ss>>tmp)
        {
            n++;
            int tlen = tmp.size();
            if(tlen>4) return "Neither";
        }

        if(n == 8)return "IPv6";
        return "Neither";
    }
    string validIPAddress(string queryIP) {
      	
        int len = queryIP.size();
        if(len == 0) return"Neither";
        
        if(queryIP[len-1]==':'||queryIP[len-1]=='.'||queryIP[0]=='.'||queryIP[0]==':') return "Neither";
        
        for(auto&c:queryIP){//根据协议特征,进入判断是否完全匹配这个协议
            if(c == '.') return Ipv4(queryIP);
            if(c == ':') return Ipv6(queryIP);
        }
        return "Neither";

        
    }
};

其实个人感觉,只要大方向框架对,分类讨论的思想,那么调个几次也问题不大,而且面试的时候,你会被提醒的,他们这道题都看腻了;

我这个写法不一定好,但是按照我写的来做,思路清晰的情况下两下就能写好功能框架;

其中比较难直接想到的边界条件1.首尾不能出现分隔符; 2.串中不能连续出现分隔符; 这俩条件,调试两次就出来了,就能过了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/193763.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SAP IFRS 17 面向服务架构详细解析(包含分类账规则)

经过漫长的旅程,国际会计准则委员会 (IASB) 于 2017 年 5 月发布了 IFRS 17“保险合同”(IFRS 17)。IFRS 17 取代了 2004 年发布的 IFRS 4。总体目标是提供一个更加透明和全球签发保险合同的实体之间保险合同的统一会计模型。在 IFRS 17 标准发布三年后,IASB 于 2020 年 6 月…

Linux下tomcat服务器的html文件部署

本章介绍使用Xshall发布命令,远程操作Linux系统,在Linux上搭建Java程序部署环境 本文章只是简单介绍html文件的部署,不涉及连接数据库 1.安装JDK 使用yum安装openjdk与windows中的jdk虽然不同,但是功能相似,这里的yum相当与中央管理仓库,包含了各种各样的软件 列出jdk相关的…

【黄啊码】PHP结合vue导出excel乱码

在这之前我们先回顾以前用php导出excel&#xff0c;我直接写成方法在这里&#xff1a; public static function phpExcelList($field, $list, $title文件,$file_time){$spreadsheet new Spreadsheet();$sheet $spreadsheet->getActiveSheet();foreach ($list as $key >…

【靶机】vulnhub靶机clover:1

靶机下载地址&#xff1a; Clover: 1 ~ VulnHub 靶机ip&#xff1a;192.168.174.145 Kali ip&#xff1a;192.168.174.128 靶机ip发现&#xff1a;sudo arp-scan -l 靶机开放端口扫描 分析&#xff1a; 发现开放了21端口ftp服务&#xff0c;且允许匿名登录 22端口ssh服务 8…

【交换机转发工作原理【泛洪、转发、丢弃】】

新的一年 新的征程 新的课程开班 等你来学&#xff01; ​一、交换机的三张表 在讲交换机转发工作原理前&#xff0c;先介绍交换机的三张表&#xff1a; 1.ARP缓存表&#xff1a;ARP(Address Resolution Protocol)地址解析协议&#xff0c;主要作用将目的IP地址解析(映射…

Linux系统中GDB调试详细操作方法

第一&#xff1a;启动 在shell下敲gdb命令即可启动gdb&#xff0c;启动后会显示下述信息&#xff0c;出现gdb提示符。 添加编译指令&#xff1a;gcc -g a.c -o test 打开指令&#xff1a;gdb test 或者 gdb 然后输入&#xff1a;file test ➜ example gdb …

数据结构:简单排序方法(插入排序和起泡排序)

1、插入排序 插入排序(insertion sort)的基本操作是将当前无序序列区 R[i…n]中的记录 R[i]“插入”到有序序列区 R[1…i-1]中,使有序序列区的长度增 1,如图所示。 例如,对下列一组记录的关键字: (49,38,65,76,27,13 ,91,52) &#xff08;3-4&#xff09; 进行插人排序的过…

【c语言】数据结构-带头双向循环链表

主页&#xff1a;114514的代码大冒险 qq:2188956112&#xff08;欢迎小伙伴呀hi✿(。◕ᴗ◕。)✿ &#xff09; Gitee&#xff1a;庄嘉豪 (zhuang-jiahaoxxx) - Gitee.com 目录 共八种链表&#xff1a; 前言 一、结构简图与分析 二、链表操作详解&#xff08;附代码实现&am…

js:原生ajax【纯js】

同步与异步区别同步&#xff1a;按顺序&#xff0c;依次执行&#xff0c;向服务器发送请求-->客户端做其他操作异步&#xff1a;分别执行&#xff0c;向服务器发送请求>同时执行其他操作原生ajax创建ajax对象var anew xmlhttprequest();设定数据的传输方式&#xff08;ge…

电容笔和触控笔的区别是什么?触控笔排行榜

电容笔和触控笔在导电材料、作用机理、用途等方面来看&#xff0c;都有着很大的不同。电容笔采用设计中等大小的笔头&#xff0c;而且采用更耐磨的材料。随着科技的进步&#xff0c;人们的生活质量也在不断提高&#xff0c;无论是在工作中&#xff0c;还是在学习中&#xff0c;…

电子仿真软件MultiSIM

Multisim是美国国家仪器(NI)有限公司推出的以Windows为基础的仿真工具&#xff0c;适用于板级的模拟/数字电路板的设计工作。它包含了电路原理图的图形输入、电路硬件描述语言输入方式&#xff0c;具有丰富的仿真分析能力。 目前MultiSIM最新版本为14.2&#xff0c;可通过NI的…

利用ArcGIS进行生态敏感性的分析

【分析说明】 生态敏感性是指生态环境遭外界的干扰和侵入时&#xff0c;生态系统受损害的可能性大小&#xff0c;它可衡量外界干扰对生态环境造成的危害程度&#xff0c;通常生态敏感性越高&#xff0c;生态环境越容易受外界因素的影响地形、植被、水体方面的生态因子及其对该…

this作用全解(全局this 、函数this、全局函数 this call apply bind……)

文章目录this 是什么全局上下文的 this函数上下文的 this全局上下文中的函数对象中的函数箭头函数构造函数显式改变函数上下文的 thiscallapplybindthis 是什么 老是记不住 this 指向谁&#xff0c;我觉得这是非常正常的现象&#xff0c;因为 this 指向的情况本身就比较多&…

linux secure boot(安全启动)下为内核模块签名

文章目录linux secure boot(安全启动)下为内核模块签名背景Secure Boot安全启动开启关闭方法内核驱动签名生成签名证书和私钥导入签名证书BIOS(UEFI)导入证书(重要)制作带签名的驱动参考linux secure boot(安全启动)下为内核模块签名 背景 随着计算机性能和存储空间的提升&am…

Mybatis对象关联数据库表【对多关联AND对一关联】

一对多分成两部分&#xff1a;对一、对多 1. 准备两张表oder、customer 2. 对多关联实现 对多关联&#xff1a;Customer类下创建一个List集合OrderBean类 public class Customer {private Integer id;private String name;//对多关联private List<OrderBean> orderBeanL…

结构型设计模式 Structural Patterns :适配器 Adapter(Python 实现)

文章大纲 python 代码实现实现1实现2实现3解决实际问题的例子参考文献与学习路径使用示例: 适配器模式在 Python 代码中很常见。 基于一些遗留代码的系统常常会使用该模式。 在这种情况下, 适配器让遗留代码与现代的类得以相互合作。 识别方法: 适配器可以通过以不同抽象或…

visual studio2019 定位内存泄漏的方法

1、首先下载一个好用的工具&#xff0c;哈哈&#xff0c;链接在下方https://kinddragon.github.io/vld/下载完后&#xff0c;进行安装&#xff0c;安装完后&#xff0c;文件夹如下所示&#xff1a;2、下面就是打开visual studio进行配置&#xff0c;将include配置好&#xff0c…

关于MAC zsh: command not found: bee 处理方案

最近在玩GO语言&#xff0c;接触到GoBee 这个框架&#xff0c;安装完成后检查beego版本时发现了这个错误“zsh: command not found: bee”。 原因:GO环境配置出问题。 此博文跳过GO的安装过程&#xff0c;直接进入正题。前提是&#xff1a;已经装好了GO。MAC 环境&#xff0c…

六氟磷酸锂洗桶废水除氟树脂吸附工艺

在六氟磷酸锂过程中&#xff0c;主要排放合成氟化锂生产废水和产品六氟磷酸锂桶清洗废水&#xff0c;主要含有氟、磷酸盐及锂&#xff0c;这是一种高氟、高浓度磷酸盐无机化工废水。 针对这类高氟、高浓度磷酸盐无机化工废水&#xff0c;常用于这类生产废水的处理技术有化学沉淀…

力扣刷题|513.找树左下角的值、112. 路径总和、113.路径总和 ii、106.从中序与后序遍历序列构造二叉树、105.从前序与中序遍历序列构造二叉树

文章表一LeetCode 513.找树左下角的值题目链接&#x1f517;思路LeetCode 112. 路径总和题目链接&#x1f517;思路LeetCode 113.路径总和 ii题目链接&#x1f517;思路LeetCode 106.从中序与后序遍历序列构造二叉树题目链接&#x1f517;思路LeetCode 105.从前序与中序遍历序列…