精华内容
下载资源
问答
  • Restore IP Addresses原题链接Restore IP Addresses给定一个仅包含数字的字符串,将其拆分成有效的ip地址题目的主要意思实际是在字符串中添加三个点,从而构成一个ip地址,有效的ip地址格式为 最多包含12个数字 每个...

    Restore IP Addresses

    原题链接Restore IP Addresses

    这里写图片描述

    给定一个仅包含数字的字符串,将其拆分成有效的ip地址

    题目的主要意思实际是在字符串中添加三个点,从而构成一个ip地址,有效的ip地址格式为

    • 最多包含12个数字
    • 每个数字在[0, 255]之间
    • 数字中除了单一0,不能出现类似0开头的数字,比如192.168.1.013中013是不允许的

    所以其实就是随便找到三个位置,判断拆分成的四块数字是否满足要求即可


    首先,为了易于理解,在安插”.”的过程中不记录组成的ip地址,只是将”.”的位置记录下来,当”.”的个数为3时统一计算

    代码如下

    class Solution {
    public:
        vector<string> restoreIpAddresses(string s) {
            vector<string> res;
            //不合法
            if(s.size() > 12)   return res;
            //记录"."的位置
            vector<int> dots;
            dfs(s, res, dots, 0);
            return res;
        }
    private:
        void dfs(string& s, vector<string>& res, vector<int>& dots, int idx)
        {
            if(dots.size() == 3)
            {
                //判断四个数字是否符合要求,然后添加
                //计算one时的写法是有原因的,可以将dots[-1] 看做 -1
                string one = s.substr(-1 + 1, dots[0] - (-1));
                string two = s.substr(dots[0] + 1, dots[1] - dots[0]);
                string three = s.substr(dots[1] + 1, dots[2] - dots[1]);
                string four = s.substr(dots[2] + 1);
                if(isValid(one) && isValid(two) && isValid(three) && isValid(four))
                    res.emplace_back(one + "." + two + "." + three + "." + four);
                return;
            }
            //因为最后一个"."后面必须有数字,所以到s.size() - 1即可
            for(int i = idx; i < static_cast<int>(s.size()) - 1; ++i)
            {
                //表示将"."放在s[i]的后面
                dots.emplace_back(i);
                dfs(s, res, dots, i + 1);
                dots.pop_back();
            }
        }
    
        bool isValid(string numStr)
        {
            if(numStr.size() > 3 || (numStr.size() > 1 && numStr.find_first_not_of('0') != 0) || (numStr.size() == 3 && numStr > "255"))
                return false;
            else
                return true;
        }
    };

    这种方法比较慢,主要的原因是会将所有可能都找出来然后判断是否合法,也就是说当确定第一个”.”的位置时,这个位置可能是不合适的,但是仍然需要进行到最后


    深度优先和回溯法的思想在于将不合法的情况扼杀在摇篮里,也就是要确定”.”的位置时判断是否满足要求,如果不满足要求,就没必要按照这个”.”的位置进行下去

    所以,需要在for循环中动手脚,判断”.”的位置是否合适。方法就是判断当前这个”.”和上一个”.”之间的数字是否符合要求,这里用prevIdx变量记录上一个”.”的位置

    由上面计算one,two,three,four的公式可知,两个”.”之间的数字正是[prevIdx+1, i],其中

    • prevIdx记录上一个”.”的位置,初始时为-1,类似公式中的dots[0]
    • i是当前要确定的”.”的位置,指在s[i]后面插入”.”,类似公式中的dots[1]

    有了上面的基础,代码可以更改为

    class Solution {
    public:
        vector<string> restoreIpAddresses(string s) {
            vector<string> res;
            //不合法
            if(s.size() > 12)   return res;
            //记录"."的位置
            vector<int> dots;
            dfs(s, res, dots, -1, 0);
            return res;
        }
    private:
        void dfs(string& s, vector<string>& res, vector<int>& dots, int prevIdx, int idx)
        {
            if(dots.size() == 3)
            {
                //判断四个数字是否符合要求,然后添加
                //计算one时的写法是有原因的,可以将dots[-1] 看做 -1
                string one = s.substr(-1 + 1, dots[0] - (-1));
                string two = s.substr(dots[0] + 1, dots[1] - dots[0]);
                string three = s.substr(dots[1] + 1, dots[2] - dots[1]);
                string four = s.substr(dots[2] + 1);
                //one two three在确定"."时已经判断过
                if(isValid(four))
                    res.emplace_back(one + "." + two + "." + three + "." + four);
                return;
            }
            //因为最后一个"."后面必须有数字,所以到s.size() - 1即可
            for(int i = idx; i < static_cast<int>(s.size()) - 1; ++i)
            {
                //判断是否满足要求
                if(!isValid(s.substr(prevIdx + 1, i - prevIdx)))
                    return;
                //表示将"."放在s[i]的后面
                dots.emplace_back(i);
                dfs(s, res, dots, i, i + 1);
                dots.pop_back();
            }
        }
    
        bool isValid(string numStr)
        {
            if(numStr.size() > 3 || (numStr.size() > 1 && numStr.find_first_not_of('0') != 0) || (numStr.size() == 3 && numStr > "255"))
                return false;
            else
                return true;
        }
    };

    再简单一点,可以不需要dots,在遍历的过程中就将最后的ip地址构造好

    class Solution {
    public:
        vector<string> restoreIpAddresses(string s) {
            vector<string> res;
            //不合法
            if(s.size() > 12)   return res;
            string cur("");
            dfs(s, res, cur, -1, 0, 0);
            return res;
        }
    private:
        void dfs(string& s, vector<string>& res, string& cur, int prevIdx, int idx, int count)
        {
            if(count == 3)
            {
                string four = s.substr(idx);
                if(isValid(four))
                    res.emplace_back(cur + four);
                return;
            }
            //因为最后一个"."后面必须有数字,所以到s.size() - 1即可
            string tmp = cur;
            for(int i = idx; i < static_cast<int>(s.size()) - 1; ++i)
            {
                //判断是否满足要求
                if(!isValid(s.substr(prevIdx + 1, i - prevIdx)))
                    break;
    
                cur.append(1, s[i]);
                cur.append(1, '.');
                dfs(s, res, cur, i, i + 1, count + 1);
                //回溯的过程需要回到原来的样子,但是这里只弹出了"."的目的是为了继续扩充当前数字
                //不需要回到append(1, s[i])之前的样子,但是return之前需要
                cur.pop_back();
            }
            //当返回时回到原来的样子
            std::swap(cur, tmp);
        }
    
        bool isValid(string numStr)
        {
            if(numStr.size() > 3 || (numStr.size() > 1 && numStr.find_first_not_of('0') != 0) || (numStr.size() == 3 && numStr > "255"))
                return false;
            else
                return true;
        }
    };

    本题主要思路是在s中选择三个位置作为”.”,同时确定分出的四个数字是否合法

    展开全文
  • BOOL isIpFormatRight(LPTSTR ip...{//判断IP地址是否合法 int a,b,c,d; if ((swscanf(ipAddress,L"%d.%d.%d.%d",&a,&b,&c,&d)==4) &&(a>=0&&a &&(b>=0&&b &&(c>=0&&c &&(d>=0&&d { return TRUE; } return
    BOOL isIpFormatRight(LPTSTR ipAddress)
    {//判断IP地址是否合法
    int a,b,c,d;
    if ((swscanf(ipAddress,L"%d.%d.%d.%d",&a,&b,&c,&d)==4)
    &&(a>=0&&a<=255)
    &&(b>=0&&b<=255)
    &&(c>=0&&c<=255)
    &&(d>=0&&d<=255))
    {
    return TRUE;
    }
    return FALSE;

    }


    展开全文
  • * 判断输入的字符串是不是一个有效的IP地址 * * 请实现如下接口 * boolisIPAddressValid(constchar* pszIPAddr) * * 输入:pszIPAddr 字符串 * 输出:true 有效的IP地址,false,无效的IP地址 * * 约束: *...
    <pre name="code" class="cpp">/**
     *	题目标题:
     *	判断输入的字符串是不是一个有效的IP地址
     *
     *	请实现如下接口
     *	boolisIPAddressValid(constchar* pszIPAddr)
     *
     *	输入:pszIPAddr 字符串
     *	输出:true 有效的IP地址,false,无效的IP地址
     *
     *	约束:
     *	输入IP为XXX.XXX.XXX.XXX格式
     *	字符串两端含有空格认为是合法IP
     *	字符串中间含有空格认为是不合法IP
     *	类似于 01.1.1.1, 1.02.3.4  IP子段以0开头为不合法IP
     *	子段为单个0 认为是合法IP,0.0.0.0也算合法IP
     */
    
    #include <string>
    #include <vector>
    using namespace std;
    
    bool isIPAddressValid(const char* pszIPAddr)
    {	
    	if (pszIPAddr == NULL)
    		return false;
    
    	bool bSpace = false;
    	const char *iter = pszIPAddr;
    	string strTemp;
    	vector<string> vstrIP;
    	int nCount = 0;//点的个数
    	int i = 0;
    
    	int nlen = (int)strlen(pszIPAddr);
    	while (i < nlen)
    	{
    		if (iter[i] == ' ')
    		{
    			if (bSpace  && i+1 < nlen && iter[i+1] != ' ')
    				return false;
    			i++;
    			continue;
    		} 
    
    		if (i+1 <= nlen && iter[i+1] == ' ')
    			bSpace = true;	
    
    		if (iter[i] == '.')
    		{
    			vstrIP.push_back(strTemp);
    			i++;
    			nCount++;
    			strTemp = "";
    			continue;
    		}
    
    		strTemp += iter[i];
    		i++;
    	}
    	vstrIP.push_back(strTemp);
    
    	if (nCount != 3)
    		return false;
    	else
    	{
    		for (int i = 0; i < (int)vstrIP.size(); ++i)
    		{
    			int len = (int)vstrIP[i].size();
    			if (len < 1 || (vstrIP[i][0] == '0' && len >= 2))
    				return false;
    
    			int n = atoi(vstrIP[i].c_str());
    			if (n < 0 || n > 255)
    				return false;
    		}
    	}
    
    	return true;
    }

    /* 还有情况没考虑到 */
    
    
    
    
    展开全文
  • 判断输入的字符串是不是一个有效的IP地址 详细描述: 请实现如下接口 boolisIPAddressValid(constchar*pszIPAddr) 输入:pszIPAddr字符串 输出:true有效的IP地址,false,无效的IP地址 约束 ...

    题目标题:

    • 判断输入的字符串是不是一个有效的IP地址

     

    详细描述:

    请实现如下接口

    boolisIPAddressValid(constchar* pszIPAddr)

    输入:pszIPAddr 字符串

    输出:true 有效的IP地址,false,无效的IP地址

     

    约束

    1. 输入IP为XXX.XXX.XXX.XXX格式

    2. 字符串两端含有空格认为是合法IP

    3. 字符串中间含有空格认为是不合法IP

    4. 类似于 01.1.1.1, 1.02.3.4  IP子段以0开头为不合法IP

    5. 子段为单个0 认为是合法IP,0.0.0.0也算合法IP

    C语言代码:

     1 #include "IPAddressValid.h"
     2 #include <string.h>
     3 
     4 bool isIPAddressValid(const char* pszIPAddr)
     5 {
     6     // 请在此处实现
     7     if(pszIPAddr == 0 || pszIPAddr == "")
     8         return false;
     9     char *p=const_cast<char*>(pszIPAddr);
    10     char *pre=0;
    11     bool flag=true;
    12     bool last=false;
    13     int pCount=0; //point number;
    14     int num=0;
    15     while(*p==' ')//不考虑前面的空格
    16         p++;
    17   //if(*p=='.')
    18   //    return false;
    19     while(*p!='\0'){
    20         if (*p != '.'){
    21             if(pCount < 3 && (*p>'9'||*p<'0'))
    22                 return false;
    23             if(pCount == 3){
    24                 if(*p != ' ' && (*p>'9'||*p<'0'))//
    25                     return false;
    26                 if(*p == ' ')//第三个'.'后面有空格,应该为结尾的空格
    27                     last = true;
    28                 if(last && *p<='9'&&*p>='0')
    29                     return false;
    30             }
    31             if(flag)//新的子段开始。
    32                 pre = p;
    33             flag=false;
    34         }else{//发现一个"."
    35             pCount++;
    36             if(!flag){
    37                 if((p-pre>1&&*pre=='0')||(p-pre>3))//排除子段以0开头,或者子段的长度大于3
    38                     return false;
    39                 if(p-pre == 3){
    40                     num=(*pre-'0')*100;
    41                     num+=(*(++pre)-'0')*10;
    42                     num+=(*(++pre)-'0');
    43           
    44                     if(num>255)
    45                         return false;
    46                 }
    47             }else if(p-pre==1){//连续出现两个'.'
    48                 return false;
    49             }else
    50                 return false;
    51             flag=true;//下一个新的子段开始
    52              pre=p;
    53         }
    54         p++;
    55     }
    56     if (pCount!=3 || *pre=='.'|| (p-pre>1&&*pre=='0'))//如果不是三个子段,或者最后一个字符为'.',或者最后一个子段第一个字符为'0'。
    57         return false;
    58     num=0;
    59     while(*pre<='9'&&*pre>='0'){
    60         num=num*10;
    61         num=num+(pre[0]-'0');
    62     
    63         pre++;
    64     }
    65     if(num>255)
    66         return false;
    67 
    68     return true;
    69 }

     

    转载于:https://www.cnblogs.com/wanghui390/p/4311877.html

    展开全文
  • 判断输入的字符串是不是一个有效的IP地址 请实现如下接口 bool isIPAddressValid(const char* pszIPAddr) 输入:pszIPAddr 字符串 输出:true 有效的IP地址,false,无效的IP地址 约束条件: 输入IP为XXX.XXX....
  • IP地址判断有效

    千次阅读 2016-04-06 12:34:02
    判断输入的字符串是不是一个有效的IP地址 详细描述: 请实现如下接口 boolisIPAddressValid(constchar* pszIPAddr) 输入:pszIPAddr 字符串 输出:true 有效的IP地址,false,无效的IP地址 约束 输入IP为XXX....
  • IP2十进制JS 这是一个非常基本JavaScript项目,会将点十进制IP地址转换为十进制格式的字符串,该网站还通过正则表达式验证IPV4是否以有效格式返回!
  • 华为OJ IP地址判断有效

    千次阅读 2014-03-29 16:30:01
    判断输入的字符串是不是一个有效的IP地址   详细描述: 请实现如下接口 boolisIPAddressValid(constchar* pszIPAddr) 输入:pszIPAddr 字符串 输出:true 有效的IP地址,false,无效的IP...
  • import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { ... * @return 布尔型 格式是否正确 */ private static boolean isValidF...
  • OJ 系列之IP地址判断有效

    千次阅读 2016-01-17 14:13:25
    1、问题描述判断输入的字符串是不是一个有效的IP地址 详细描述: 请实现如下接口 bool isIPAddressValid(constchar* pszIPAddr) 输入:pszIPAddr 字符串 输出:true 有效的IP地址,false,无效的IP地址 约束 ...
  • 一、示例 示例 1: 输入:s = "25525511135" ...有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。 例如:“0.1.2.201” 和 “192.168.1
  • 判断输入的字符串是不是一个有效的IP地址 详细描述: 请实现如下接口 boolisIPAddressValid(constchar* pszIPAddr) 输入:pszIPAddr 字符串 输出:true 有效的IP地址,false,无效的IP地址 约束 输入IP为XXX....
  • 简单实用有效获取树莓派ip地址

    千次阅读 2019-09-20 22:26:33
    简单说,就是通过树莓派连接手机热点来获取树莓派ip地址。 具体操作如下: 1.在手机配置WLAN热点中可以看到网络名称,加密类型,密码。 2.将刷好 Raspbian 系统 SD 卡用电脑读取。在 boot 分区,也就是树莓派 ...
  • 【C++】判断IP地址有效

    千次阅读 2015-03-03 20:07:48
    题目:判断输入的字符串是不是一个有效的IP地址详细描述: 请实现如下接口 booli sIPAddressValid ( const char * pszIPAddr ) 输入: pszIPAddr 字符串 输出:true 有效的IP地址,false,无效的IP地址 ...
  • 判断输入的字符串是不是一个有效的IP地址 详细描述: 请实现如下接口  boolisIPAddressValid(constchar* pszIPAddr)  输入:pszIPAddr 字符串  输出:true 有效的IP地址,false,无效的IP地址 约束 输入IP为...
  • 1、检查ip的有效性 int isIpValid(const char *ip) { int ipPartArr[IP_PARTS_CNT] = {0}; assert(ip); /* 格式ip */ if (IP_PARTS_CNT != sscanf(ip, "%d.%d.%d.%d", &ipPartArr[0], &ipPartArr[1],...
  • leetcode93 复原IP地址 之前面试字节跳动遇到该题,当时时间较短,只有大致思路和基本首先框架,没有AC了,今天又正好看见该题。 93. 复原IP地址 ...分析:首先明白,什么是一个合法的IP地址:应该分成
  • 推断输入的字符串是不是一个有效的IP地址 具体描写叙述: 请实现例如以下接口 boolisIPAddressValid(constchar* pszIPAddr) 输入:pszIPAddr 字符串 输出:true 有效的IP地址,false,无效的IP地址 约束 输入...
  • 复原IP地址

    2020-11-28 23:27:51
    今天的题目是求出有效的IP地址 我们先来读一下题目要求: 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。 有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0...
  • IP地址概论

    2020-12-24 01:07:10
    IP地址概论IP地址简介一、IP地址简介二、IP地址的组成三、子掩网码四、IP地址段分类五、公有地址与私有地址六、 有效主机容量计算总结 IP地址简介 一、IP地址简介 IP地址是指互联网协议地址(英语:Internet ...
  • IP地址

    2019-05-21 23:40:00
    IPv4地址格式 网络互连的一个重要前提条件是要有一个有效的地址结构,并且所有的互连网络用户都应遵守这个地址结构。因为只有这样所有的互连网络用户才能在统一的规定下相互之间通讯。这个地址结构可以有许多不同...
  • 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式有效的 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成),整数之间用 ‘.’ 分隔。 示例: 输入: “25525511135” 输出: [“255.255.11...
  • 仅此记录我树莓派4B痛苦踩坑记录 1. 前期准备 (1) 硬件准备 ...2.IP地址获取 1. 在SD卡中烧录树莓派镜像(操作系统) (1) 在树莓派官网下载匹配自己树莓派版本镜像,如果是新版本最好用最新镜像。
  • 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。 例如:"0.1.2.201" 和 "192....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 641
精华内容 256
关键字:

有效的ip地址格式