首页 > 编程语言 >代码随想录算法训练营第24天:回溯03:93.复原IP地址;78.子集;90.子集II

代码随想录算法训练营第24天:回溯03:93.复原IP地址;78.子集;90.子集II

时间:2024-07-27 22:53:33浏览次数:10  
标签:24 count returnSize int 随想录 char 子集 ans path

93.复原IP地址

力扣题目链接(opens new window)

给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。

有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。

例如:"0.1.2.201" 和 "192.168.1.1" 是 有效的 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "[email protected]" 是 无效的 IP 地址。

注意**:

1、sprintf:sprintf 没有办法拷贝char*格式的东西,需要用strcpy

2、一个个输入字符,最后形成字符串:老老实实开辟(len+1)的空间,一个个输入字符,最后添加or不添加‘\0’都可以,可以提前添加'\0'终止字符串的创建

3、为什么不能用ascii码做

用ascii比较字符串大小的时候:需要保证两个都是‘\0’结尾

而strncpy是截取了一段,需要补上‘\0’

void bp(char *s,int *returnSize,char **ans,char*path,int p,int count,int index,int totallen){
    if(count ==5){
        ans[*returnSize]=(char*)malloc(sizeof(char)*(totallen+4));
        path[p-1]='\0';
        strcpy(ans[*returnSize], path);
        printf("%s\n",path);
        (*returnSize)++;

        return;
    }
    char *d=(char *)malloc(sizeof(char)*5);
    //printf("i=%d ,count=%d,p=%d,totallen=%d\n",index,count,p,totallen);
    //printf("%d",(4-count)*3+index+1);

    if(index<totallen && (4-count)+index+1<=totallen && totallen<=(4-count)*3+index+1){
        //strncpy(d,s+index,1);
        printf("1111");printf("i=%d ,count=%d,p=%d,totallen=%d\n",index,count,p,totallen);
        
        path[p]=s[index];
        path[p+1]='.';
        
        //sprintf(path+p, "%s.", d);
        
        bp(s, returnSize, ans,path,  p+2, count+1,index+1,totallen);
    }
    if( index+1<totallen && s[index]!='0' && (4-count)+index+2<=totallen && totallen<=(4-count)*3+index+2  ){
        //strncpy(d,s+index,2);
        //sprintf(path+p, "%s.", d);——感觉sprintf用不了的原因应该是????????
        printf("2222");printf("i=%d ,count=%d,p=%d,totallen=%d\n",index,count,p,totallen);
        
        path[p]=s[index];
        path[p+1]=s[index+1];
        path[p+2]='.';
        
        bp(s, returnSize, ans,path,  p+3, count+1,index+2,totallen);
    }
    if(index+2<totallen && s[index]!='0' && (4-count)+index+3<=totallen && totallen<=(4-count)*3+index+3 ){
        printf("3333");printf("i=%d ,count=%d,p=%d,totallen=%d\n",index,count,p,totallen);
        strncpy(d,s+index,3);
        printf("%d",strcmp(d,"255"));
        //(s[index]-'0')*100+(s[index+1]-'0')*10+s[index+2]-'0'<=255
        //sprintf(path+p, "%s.", d);
        if((s[index]-'0')*100+(s[index+1]-'0')*10+s[index+2]-'0'<=255) 为什么不能用strcmp和字符串比较的方法?
        {path[p]=s[index];
        path[p+1]=s[index+1];
        path[p+2]=s[index+2];
        path[p+3]='.';
        
        bp(s, returnSize, ans,path,  p+4, count+1,index+3,totallen);}
    

    }

}


char** restoreIpAddresses(char* s, int* returnSize) {
    char **ans=(char **)malloc(sizeof(char*)*200);
    *returnSize=0;

    int len=strlen(s);
    if(len >12 || len<4) return NULL;

    char *path=(char *)malloc(sizeof(char)*(len+5));
    int p=0;


    bp(s, returnSize, ans, path, 0, 1, 0, len);
    
    return ans;

}

78.子集

力扣题目链接(opens new window)

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例: 输入: nums = [1,2,3] 输出: [ [3],   [1],   [2],   [1,2,3],   [1,3],   [2,3],   [1,2],   [] ]

void bp(int *nums,int numsSize,int *returnSize,int **ans,int *path,int p,int **returnColumnSizes,int count,int start){
    if(count>=numsSize ){

        ans[*returnSize]=(int*)malloc(sizeof(int )*p);
        memcpy(ans[*returnSize], path,sizeof(int)*p);
        (*returnColumnSizes)[*returnSize]=p;
        (*returnSize)++;
        return;    
    }
    for(int i=start;i<numsSize;i++){
        bp(nums, numsSize, returnSize, ans, path, p, returnColumnSizes, count+1,i+1);//放或不放

        path[p]=nums[i];
        bp(nums, numsSize, returnSize, ans, path, p+1, returnColumnSizes, count+1,i+1);
    }
}

int** subsets(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {
    int **ans=(int**)malloc(sizeof(int *)*pow(2,numsSize));
    *returnSize=0;

    int *path=(int*)malloc(sizeof(int)*numsSize);
    int p=0;

    *returnColumnSizes=(int *)malloc(sizeof(int)*pow(2,numsSize));

    bp(nums,  numsSize,returnSize, ans, path, p, returnColumnSizes, 0,0);
    return ans;

}

90.子集II

力扣题目链接(opens new window)

给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

  • 输入: [1,2,2]
  • 输出: [ [2], [1], [1,2,2], [2,2], [1,2], [] ]

分析:

防止重复——从小到大排列——数出重复的个数,然后再进行插入

int cmp(const void* a, const void* b){    return *(int*)a - *(int*)b;}

void bp(int *nums,int numsSize,int *returnSize,int **ans,int *path,int p,int **returnColumnSizes,int start){
    if(start>=numsSize ){

        ans[*returnSize]=(int*)malloc(sizeof(int )*p);
        memcpy(ans[*returnSize], path,sizeof(int)*p);
        (*returnColumnSizes)[*returnSize]=p;
        (*returnSize)++;
        return;    
    }

    int j=start;
    while (j<numsSize-1 && nums[j]==nums[j+1]){//重复的个数有j-start个,有j-start+1个i
        j++;
    }
    printf("%d %d  \n",start,j);
    //分别放入0个~j-start+1个i
    for (int k=0;k<=j-start+1;k++){
        int in;
        for (in=0;in <k;in++){
            path[p+in]=nums[j];
        }
        bp(nums, numsSize, returnSize, ans, path, p+k, returnColumnSizes,j+1);
    }

 
}

int** subsetsWithDup(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {
    qsort(nums, numsSize, sizeof(int), cmp);
    int **ans=(int**)malloc(sizeof(int *)*pow(2,numsSize));
    *returnSize=0;

    int *path=(int*)malloc(sizeof(int)*numsSize);
    int p=0;

    *returnColumnSizes=(int *)malloc(sizeof(int)*pow(2,numsSize));

    bp(nums,  numsSize,returnSize, ans, path, 0, returnColumnSizes, 0);
    return ans;
}

标签:24,count,returnSize,int,随想录,char,子集,ans,path
From: https://blog.csdn.net/weixin_65180740/article/details/140709877

相关文章

  • 20240727速览交通领域大模型论文【截至2024年4月中旬】
    先存个档,这位博主的帖子比较全面细致,明天有空的话拜读一下,再进一步做细致总结归纳:https://blog.csdn.net/smartlab307/category_10944669.html一、交通大模型(一)北交大TransGPT・致远(国内首款综合交通大模型)论文地址:[2402.07233]TransGPT:Multi-modalGenerativePre-traine......
  • 代码随想录算法训练营第九天 | 151.翻转字符串里的单词,卡码网:55.右旋转字符串,28. 实现
    151.翻转字符串里的单词题目链接:力扣题目链接文章讲解:代码随想录 视频讲解:字符串复杂操作拿捏了!|LeetCode:151.翻转字符串里的单词思路这道题目可以说是综合考察了字符串的多种操作。其实这道题和反转字符串这道题目很像,而且用法也是通用的方法一:切片,reverse,以及......
  • 代码随想录算法训练营第十天 | 232.用栈实现队列 , 225. 用队列实现栈 , 20. 有效的括号
    前两道题目之前单独写了文章,此处就不再重复。232.用栈实现队列-CSDN博客225.用队列实现栈-CSDN博客20.有效的括号题目链接:力扣题目链接文章讲解:代码随想录 视频讲解:栈的拿手好戏!|LeetCode:20.有效的括号思路括号匹配是使用栈解决的经典问题。由于栈结构的......
  • AT24C02(IIC)
    AT24C02概述:AT24C02是一个2K位串行CMOSE2PROM,内部含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗。AT24C02有一个16字节页写缓冲器。该器件通过IIC总线接口进行操作,有一个专门的写保护功能主要特点:存储容量:2Kbit(256字节),可用作保存小块配置数据......
  • 24-暑假软件工程周报(4)
    学习HBase与Hadoop生态系统的集成,并探索了如何利用Hadoop的各项功能来增强HBase的能力。1.如何通过MapReduce将数据从HDFS导入HBase。为了实现这一目标,我编写了一个简单的MapReduce作业。在Mapper中,我读取HDFS上的数据并转换为HBase支持的格式,在Reducer中,我将这些数据写入HBase表......
  • 2024“钉耙编程”中国大学生算法设计超级联赛(3)复盘总结
    2024“钉耙编程”中国大学生算法设计超级联赛(3)本场我其实并没有给团队贡献是任何一个AC,连最简单的题都因为题目读错没有写出来。纯纯抱大佬大腿,然后赛后被嘲讽深度自同构-limie首先,先考虑对于一个有\(n\)个节点的树应该怎么做。设\(f_i\)表示\(i\)个节点的树中有多少个......
  • 2024-07-27:用go语言,给定一个正整数数组,最开始可以对数组中的元素进行增加操作,每个元素
    2024-07-27:用go语言,给定一个正整数数组,最开始可以对数组中的元素进行增加操作,每个元素最多加1。然后从修改后的数组中选出一个或多个元素,使得这些元素排序后是连续的。要求找出最多可以选出的元素数量。输入:nums=[2,1,5,1,1]。输出:3。解释:我们将下标0和3处的元素增加1......
  • 代码随想录 day 37 完全背包 | 零钱兑换 II | 组合总和 Ⅳ | 爬楼梯 (进阶)
    完全背包完全背包解题思路由于我们可以重复放入物体,那么在遍历背包重量时就必须从前往后遍历,因为这样就可以重复放入了,其余的部分和01背包相同知识点完全背包心得学会了如何解决纯完全背白零钱兑换II零钱兑换II解题思路和之前01背包求总数的思路相同,唯一的不同点在......
  • 2024.7.27 test
    A有\(n\)个火炬,分为寒冰的和火炬的,你要在这\(n\)个火炬前放置豌豆射手,给出每个豌豆射手的伤害。求对于所有区间\([l,r]\),在这些火炬前自由放置豌豆,到达最后一个火炬之后最大伤害的和。其中如果最后是火炬/寒冰的豌豆伤害翻倍。\(n\le1e6\)。注意到如果有两个相邻的火炬/......
  • 2024.7.26 test
    A给定序列\(A\),构造\(p_i\),使得\(\sum|i-p_i|\)最小,且\(B=\{A_{p_i}\}\)满足奇偶交错出现,且最小化\(B\)字典序。\(n\le1e5\)。如果没有最小化字典序,那么我们奇偶分别按照相对顺序分配位置即可。最小化字典序怎么做呢?我们先把连续的向左或向右的连续段拿出来。例如......