牛客题霸 [ 验证IP地址] C++题解/答案

题目描述

编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址

IPv4 地址由十进制数和点来表示,每个地址包含4个十进制数,其范围为 0 - 255, 用(".")分割。比如,172.16.254.1;
同时,IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01 是不合法的。

IPv6 地址由8组16进制的数字来表示,每组表示 16 比特。这些组数字通过 (":")分割。比如, 2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个有效的地址。而且,我们可以加入一些以 0 开头的数字,字母可以使用大写,也可以是小写。所以, 2001:db8:85a3:0:0:8A2E:0370:7334 也是一个有效的 IPv6 address地址 (即,忽略 0 开头,忽略大小写)。

然而,我们不能因为某个组的值为 0,而使用一个空的组,以至于出现 ( : : ) 的情况。 比如, 2001:0db8:85a3::8A2E:0370:7334 是无效的 IPv6 地址。
同时,在 IPv6 地址中,多余的 0 也是不被允许的。比如, 02001:0db8:85a3:0000:0000:8a2e:0370:7334 是无效的。

说明: 你可以认为给定的字符串里没有空格或者其他特殊字符。

题解:

其实就是按照题意模拟检验
注意特殊情况判断

代码:

class Solution {public:/*** 验证IP地址* @param IP string字符串 一个IP地址字符串* @return string字符串*/string solve(string IP) {int pos1 = IP.find(".");int pos2 = IP.find(":");if((pos1 == IP.npos && pos2 != IP.npos) || (pos1 != IP.npos && pos2 == IP.npos)){string s = pos1 == IP.npos?":" : ".";int cnt = 0;int pos = IP.find(s);IP+=s;while(pos != IP.npos){string temp = IP.substr(0,pos);if(s == "."){if(temp.length() == 0 || temp.length() >= 4 || cnt >= 4)return "Neither";for(int i=0;i<temp.length();i++){char c=temp[i];if(!isdigit(c))return "Neither";}int x = stoi(temp);if(x >= 256 || x < 0)return "Neither";if(to_string(x) != temp)return "Neither";}else{if(temp.length() >= 5 || temp.length() == 0 || cnt >= 8)return "Neither";for(int i=0;i<temp.length();i++){char c=temp[i];if(!isxdigit(c))return "Neither";}}IP = IP.substr(pos + 1,IP.size());pos = IP.find(s);cnt++;}if(s == ".")return cnt == 4 ? "IPv4" : "Neither";elsereturn cnt == 8 ? "IPv6" : "Neither";}return "Neither";}
};

牛客题霸 [ 验证IP地址] C++题解/答案相关推荐

  1. 牛客题霸 [矩阵元素查找] C++题解/答案

    牛客题霸 [矩阵元素查找] C++题解/答案 题目描述 已知int一个有序矩阵mat,同时给定矩阵的大小n和m以及需要查找的元素x,且矩阵的行和列都是从小到大有序的.设计查找算法返回所查找元素的二元数 ...

  2. 牛客题霸 [栈和排序] C++题解/答案

    牛客题霸 [栈和排序] C++题解/答案 题目描述 给你一个1->n的排列和一个栈,入栈顺序给定 你要在不打乱入栈顺序的情况下,对数组进行从大到小排序 当无法完全排序时,请输出字典序最大的出栈序 ...

  3. 牛客题霸 [字符串的排列] C++题解/答案

    牛客题霸 [字符串的排列] C++题解/答案 题解: stl真好用,emmm... 代码: class Solution {public:vector<string> Permutatio ...

  4. 牛客题霸 [表达式求值] C++题解/答案

    牛客题霸 [表达式求值] C++题解/答案 题目描述 请写一个整数计算器,支持加减乘三种运算和括号. 题解: 没有除法emmm 我们从头开始依次判断每个字符 如果是左括号,我们就找右括号,并截取括号内 ...

  5. 牛客题霸 [判断回文] C++题解/答案

    牛客题霸 [判断回文] C++题解/答案 题目描述 给定一个字符串,请编写一个函数判断该字符串是否回文.如果回文请返回true,否则返回false. 题解: 左右两端同时向中间缩 代码: class ...

  6. 牛客题霸 [分糖果问题] C++题解/答案

    牛客题霸 [分糖果问题] C++题解/答案 题目描述 一群孩子做游戏,现在请你根据游戏得分来发糖果,要求如下: 每个孩子不管得分多少,起码分到一个糖果. 任意两个相邻的孩子之间,得分较多的孩子必须拿多 ...

  7. 牛客题霸 [合并有序链表] C++题解/答案

    牛客题霸 [合并有序链表] C++题解/答案 题目描述 将两个有序的链表合并为一个新链表,要求新的链表是通过拼接两个链表的节点来生成的. 题解: 首先判断l1和l2是否为空 然后依次比较l1和l2的值 ...

  8. 牛客题霸 [二叉树的镜像]C++题解/答案

    牛客题霸 [二叉树的镜像]C++题解/答案 题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 题解: 根据题也不难看出,二叉树的镜像定义其实就是左右树翻转 所以我们一直递归左子树,到头后递归右子 ...

  9. 牛客题霸 [ 树的直径] C++题解/答案

    牛客题霸 [ 树的直径] C++题解/答案 题目描述 给定一棵树,求出这棵树的直径,即两个节点距离的最大值. 题解: 不知道大家听没听过一个结论: 树的直径可以通过两边dfs找到 步骤: 1.从任意一 ...

最新文章

  1. 如何实现高容量大并发数据库服务 | 数据库分布式架构设计
  2. 面试文员计算机水平考题,一般电脑文员面试上机操作的时候会考什么?
  3. AI真的会杀人?DeepMind开发了二维网格游戏来做测试
  4. 【若依(ruoyi)】No message found under code ‘xxx‘ for locale ‘zh_CN‘.
  5. ASP.NET 4新增功能(三) 对Web标准的支持和辅助功能的增强
  6. MyBatis关键配置-创建会话工厂
  7. IntelliJ IDEA for Mac如何配置数据源(Data Source)和用户驱动(User Driver)及数据库控制台_数据源配置(Console)详解
  8. C#制作QQ截图的自动框选功能的个人思路(二)设置Hook
  9. Go语言中正则表达式的使用
  10. SQL数据库中日期时间类型,按日期group by 实现
  11. 怎样快速开发属于自己的微信小程序?
  12. dell服务器新bois系统设置u盘启动,戴尔新版本的bios怎样设置U盘启动
  13. 什么是供应链管理及其重要性?
  14. excel乘法公式怎么输入_智能考勤表,MM你再也不用加班了!【Excel教程】
  15. Android: SQLite + ListView 实现 新闻 App
  16. Charles 限制网络速度(Throttle设置)
  17. java变量的定义有哪些规则_Java变量详解
  18. 看山是山,看水是水;看山不是山,看水不是水;看山还是山,看水还是水。
  19. NetWorker Pro for mac(网络流量监控软件)
  20. 在大学时的分布式数据库读书笔记 拿出来分享

热门文章

  1. 黑客大佬:我是如何让50个文件一起骗过AI安防系统的?
  2. 为什么我们总是忍不住要刷微信?
  3. 将历史、数学、语文、地理、政治知识融会贯通的诀窍就是它
  4. python从入门到爬虫_python爬虫从入门到放弃(一)之初识爬虫
  5. 线性跟驰模型 matlab,Bierley非线性跟驰模型特性仿真分析
  6. 面试避坑手册之 Java字节流和字符流总结IO流!
  7. java获取整点与凌晨的时间戳
  8. linux ll 转数组,List、Set、数组之间的转换
  9. linux系统故障实验,Linux常见系统故障排除
  10. mysql卸载时弹框,win10卸载mysql5安装mysql8