【打卡】牛客网:BM85 验证IP地址

之前涉及到IP地址的题有:

  1. BM74 数字字符串转化成IP地址
  2. BM22 比较版本号

BM85题目要求:

IPv4:

  1. 4组十进制数,范围是0-255
  2. 每组前无“0”
  3. 分隔符是“.”

IPv6:

  1. 8组十六进制数,忽略大小写
  2. 每组前可以有“0”,保证每组由4个字符组成
  3. 分隔符是“:”

IPv4错误示例:

  1. 不是4组:254.254.254
  2. 位数大于3:2541.254.254.254
  3. 分隔符连续:254.254..254
  4. 不是十进制数(0-9):254.254.a.254
  5. 出现前导“0”:254.254.054.254
  6. 不在0-255的范围:254.254.256.254

IPv6的错误示例:

  1. 不是8组
  2. 位数大于4
  3. 分隔符连续
  4. 不是十六进制数(0-9,a-f,A-F)

关于前导“0”

  1. IPv6允许出现前导“0”,即,a:a:0a:a:a:a:a:a
  2. 允许出现连续“0”,即,a:a:00a:a:a:a:a:a、a:a:000:a:a:a:a:a、a:a:0000:a:a:a:a:a

BM85的测试用例

牛客网的测试用例很水,程序错了都能通过9个。 (IPv4、IPv6没有分隔符连续的用例、IPv4没有前导“0”的用例)

我写的:

  1. 这种用if判断的题,关键是能考虑所有情况。
  2. 以分隔符对字符串进行分隔的split()函数:
    1. c++好像没有split(),需要自己定义。(python有)
  3. 判断是否是数字:
    1. 可以用isdigit(ip[i][j]),或者ip[i][j] > '0' && ip[i][j] < '9'
    2. isdigit(ip[i][j])更保险,还判断了是否为空,保证后面的stoi()能正常运行。
  4. string转为int
    1. 用stoi()函数:int num = stoi(ip[i])
  5. substr()调试很久:
    1. substr(i,n),表示在位置i截取n个字符
    2. 不是表示substr(start, end),即,截取[位置start,位置end)。

以下是我的代码:

我的split()函数写得稀烂,根据用例调试很久。模板的split()写得好一些。 

class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** 验证IP地址* @param IP string字符串 一个IP地址字符串* @return string字符串*/vector<string> split(string str, char c) {vector<string> ans;int start = -1;int end = 0;while (end < str.size()) {if (str[end] == c) { //粗心,不是end == cif(end == str.size() - 1){ans.push_back(str.substr(start + 1, end - start)); ans.push_back("");start = end;}ans.push_back(str.substr(start + 1, end - start - 1)); //"1"是1组,“1.1..1”是4组,“.1.1.1”是4组,“1.1.1.1.”是4组start = end;}else if (end == str.size() - 1) {  //调试很久,不然最后一组不能放入ans.push_back(str.substr(start + 1, end - start)); start = end;}end++;}return ans;}bool isIPv4(string IP) {vector<string> ip = split(IP, '.');//必须有4组if (ip.size() != 4)return false;//每组进行分析for (int i = 0; i < 4; i++) {//每组不为空,且最多有3个字符if (ip[i].size() == 0 || ip[i].size() > 3) return false;//不能有前导“0”if(ip[i].size()>1 && ip[i][0] == '0')return false;//必须是十进制字符for (int j = 0; j < ip[i].size(); j++)if (!((ip[i][j] >= '0' && ip[i][j] <= '9')))return false;//必须在0-255范围int num = stoi(ip[i]); //调试,ip[i]必须是数字,必须【非空】。if (num > 255) return false;}return true;}bool isIPv6(string IP) {vector<string> ip = split(IP, ':');//必须有8组if (ip.size() != 8)return false;//每组进行分析for (int i = 0; i < 8; i++) {//每组不为空,且最多有4个字符if (ip[i].size() == 0 || ip[i].size() > 4)return false;//必须是十六进制字符for (int j = 0; j < ip[i].size(); j++)if (!((ip[i][j] >= '0' && ip[i][j] <= '9') ||(ip[i][j] >= 'a' && ip[i][j] <= 'f') ||(ip[i][j] >= 'A' && ip[i][j] <= 'F'))){ //粗心,忘记加等号“=”。cout<<ip[i][j]<<endl;;return false;}}return true;}string solve(string IP) {// write code herebool flag1 = isIPv4(IP);bool flag2 = isIPv6(IP);if (flag1)return "IPv4";if (flag2)return "IPv6";return "Neither";}
};

模板的:

 模板的split(),在while循环中,会把截取的字符串去掉,所以每次只需要截取前n个即可。

      vector<string> split(string str, char c) {vector<string> ans;int end;while((end = str.find(c)) && end != str.npos){ans.push_back(str.substr(0,end));str = str.substr(end+1);}ans.push_back(str); //易粗心漏掉return ans;}

一些关键点:

1. string::npos

  1. string::type_size 类型,也就是find()返回的类型。
  2. 定义
    1. size_t npos = -1,-1为size_t的最大值。
  3. 表示返回值,表示没有匹配项。
    1. 例如,定义size_t index = str.find("abc"),再判断if(index == string::npos)
  4. 作为长度参数,表示直到字符串结束。
    1. 例如,str1.replace(index, string::npos, str2)
  5. 注:建议直接使用if(str.find("abc") == string::npos)。
    1. 因为如果先定义int index = str.find("abc") ,再判断if(index == string::npos),比较结果可能为false。

C++中std::string::npos的用法_C 语言_脚本之家 (jb51.net)

C++中string::npos的用法总结-CSDN博客

2. while((赋值语句))

  1. 先执行赋值语句,然后对左值进行判断。如果左值为0,则while退出;否则,while继续循环。
  2. 再加一个括号(),告知编译器:赋值操作符“=”是对的,而不是判断符“==”的误写。
  3. while((c = *p ++))   // 读取字符串中的字符,直到字符串结尾。具体步骤是:先把*p赋值给c,然后执行指针移位,再判断c的值。如果c值为0,代表字符串结束,退出循环。
  4. while(b=a,b-=1)   // 依次运行,以最后的一段作为结果。

 C语言中,while()语句括号内可以是赋值语句吗? (sogou.com)

此外,刷到i++和++i的区别:

C++在使用while循环时关于i++和++i的注意事项_while是不是只能用i++-CSDN博客

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

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

相关文章

Java选择排序

选择排序是一种简单直观的排序算法&#xff0c;其基本思想是每一轮从待排序的元素中选择最小&#xff08;或最大&#xff09;的元素&#xff0c;将其与当前位置的元素交换。选择排序的实现步骤可以简要概括为&#xff1a; 初始化&#xff1a; 遍历整个数组&#xff0c;将当前位…

【设计模式】什么场景可以考虑使用简单工厂模式

1.概述 工厂模式是一种创建型模式&#xff0c;主要作用就是创建对象&#xff0c;将对象的创建过程和使用的过程进行解耦。我们平时说的工厂模式实际上是对三种不同类型的工厂模式的统称&#xff0c;简单工厂、工厂方法、抽象工厂&#xff0c;而在23种设计模式中&#xff0c;只…

深度学习笔记(六)——网络优化(2):参数更新优化器SGD、SGDM、AdaGrad、RMSProp、Adam

文中程序以Tensorflow-2.6.0为例 部分概念包含笔者个人理解&#xff0c;如有遗漏或错误&#xff0c;欢迎评论或私信指正。 截图和程序部分引用自北京大学机器学习公开课 在前面的博文中已经学习了构建神经网络的基础需求&#xff0c;搭建了一个简单的双层网络结构来实现数据的分…

9.【TypeScript 教程】接口(Interface)

TypeScript 接口(Interface) 本节介绍 TypeScript 各种类型接口的声明及其使用方法&#xff0c;接口在 TypeScript 中是极其重要的&#xff0c;我们使用接口来定义契约&#xff0c;如类型命名、属性检查、函数类型定义等。 在下一节学习完类之后&#xff0c;你会知道类也可以…

机器学习~从入门到精通(三)梯度下降法

一、梯度下降法 # 梯度下降不是一种算法&#xff0c;是一种最优化方法 # 上节课讲解的梯度下降的案例 是一个简单的一元二次方程 # 最简单的线性回归&#xff1a;只有一个特征的线性回归&#xff0c;有两个theta # 二、在多元线性回归中使用梯度下降求解 三、### R…

系统学习Python——警告信息的控制模块warnings:为新版本的依赖关系更新代码

分类目录&#xff1a;《系统学习Python》总目录 在默认情况下&#xff0c;主要针对Python开发者&#xff08;而不是Python应用程序的最终用户&#xff09;的警告类别&#xff0c;会被忽略。 值得注意的是&#xff0c;这个“默认忽略”的列表包含DeprecationWarning&#xff08…

vuex是什么?怎么使用?哪种功能场景使用它?

Vuex是Vue.js官方推荐的状态管理库&#xff0c;用于在Vue应用程序中管理和共享状态。它基于Flux架构和单向数据流的概念&#xff0c;将应用程序的状态集中管理&#xff0c;使得状态的变化更可追踪、更易于管理。Vuex提供了一个全局的状态树&#xff0c;以及一些用于修改状态的方…

求斐波那契数列矩阵乘法的方法

斐波那契数列 先来简单介绍一下斐波那契数列&#xff1a; 斐波那契数列是指这样一个数列&#xff1a;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8&#xff0c;13&#xff0c;21&#xff0c;34&#xff0c;55&#xff0c;89……这个数列从第3项开始 &…

[NAND Flash 6.3] NAND FLASH基本编程(写)操作及原理_NAND FLASH Program Operation 源码实现

依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< 全文 3244 字 ​ 前言 使用的NAND FLASH的硬件原理图,面对这些引脚,很难明白他们是什么含义,下面先来个热身: 问1. 原理图上NAND FLASH只有数据线,怎…

行业内参~移动广告行业大盘趋势-2023年12月

前言 2024年&#xff0c;移动广告的钱越来越难赚了。市场竞争激烈到前所未有的程度&#xff0c;小型企业和独立开发者在巨头的阴影下苦苦挣扎。随着广告成本的上升和点击率的下降&#xff0c;许多原本依赖广告收入的创业者和自由职业者开始感受到前所未有的压力。 &#x1f3…

使用pygame实现简单的烟花效果

import pygame import sys import random import math# 初始化 Pygame pygame.init()# 设置窗口大小 width, height 800, 600 screen pygame.display.set_mode((width, height)) pygame.display.set_caption("Fireworks Explosion")# 定义颜色 black (0, 0, 0) wh…

基于Java SSM框架实现在线作业管理系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现在线作业管理系统演示 JSP技术 JSP技术本身是一种脚本语言&#xff0c;但它的功能是十分强大的&#xff0c;因为它可以使用所有的JAVA类。当它与JavaBeans 类进行结合时&#xff0c;它可以使显示逻辑和内容分开&#xff0c;这就极大的方便了运动员的需求…

【DIY summaries on Linux】

DIY Linux summaries 1) difference between ways of creation file and edit files1.1) echoecho talk to yourself touch 1) difference between ways of creation file and edit files 1.1) echo ###) > echo talk to yourself touch

数据治理工程师CDGA数据架构

1. 企业架构不包括哪项&#xff1f;&#xff08;C &#xff09; A 业务架构 B 数据架构 C 系统架构 D 技术架构 2. 关于架构设计生命周期描述错误的是&#xff1f;( D ) A 可以是针对当前的 B 可以是面向未来的 C 可以是已实施完成的 D 可以是已经退役 10 年的 3. 关于企业数据…

IPv6组播--SSM Mapping

概念 SSM(Source-Specific Multicast)称为指定源组播,要求路由器能了解成员主机加入组播组时所指定的组播源。 如果成员主机上运行MLDv2,可以在MLDv2报告报文中直接指定组播源地址。但是某些情况下,成员主机只能运行MLDv1,为了使其也能够使用SSM服务,组播路由器上需要提…

k8s-数据卷

存储卷----数据卷 容器内的目录和宿主机的目录进行挂载 容器在系统上的生命周期是短暂的&#xff0c;delete&#xff0c;k8s用控制创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态也会恢复到初识状态 一旦容器回到初始状态&#xff0c;所有得分后天编辑的文件…

粒子群算法优化RBF神经网络回归分析

目录 完整代码和数据下载链接:粒子群算法优化RBF神经网络回归分析(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88738570 RBF的详细原理 RBF的定义 RBF理论 易错及常见问题 RBF应用实例,基于rbf的空调功率预测 代码 结果分析 展望…

通过Wireshark抓包分析谈谈DNS域名解析的那些事儿

原创/朱季谦 本文主要想通过动手实际分析一下是如何通过DNS服务器来解析域名获取对应IP地址的&#xff0c;毕竟&#xff0c;纸上得来终觉浅&#xff0c;绝知此事要躬行。 一、域名与IP地址 当在浏览器上敲下“www.baidu.com”时&#xff0c;一键回车&#xff0c;很快&#x…

Linux远程登陆协议ssh

目录 一、SSH服务 1. ssh基础 2. 原理 3. 服务端配置 3.1 常用配置项 3.2 具体操作 3.2.1 修改默认端口号 3.2.2 禁止root用户登录 3.2.3 白名单列表 3.2.4 黑名单列表 3.2.5 使用秘钥对及免交互验证登录 3.2.6 免交互式登录 一、SSH服务 1. ssh基础 SSH&…

VQE音频处理流程

VQE 上行VQE&#xff0c;主要针对MIC采集部分的音频增强 下行VQE&#xff0c;主要针对SPK播放部分的音频增强 附关键词解释 RES RES 模块为重采样&#xff08;Resampler&#xff09;模块。当AI上行或AO下行通路中开启VQE 各功能 模块时&#xff0c;在处理前后各存在一次重采样…