leetcode C语言第二例 求和

🤷‍♂️题目一:

剑指 Offer 64. 求1+2+…+n

1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

此题有许多限制条件,导致许多方法难以奏效,要解决此题,首先我们得知道一个字符&&的意义:

🧐知识点补充:

     &&和||的介绍:

&& 和 || 是逻辑运算符,分别是逻辑与(&&)和逻辑或(||)

1) && (逻辑与):(三种)

① 当逻辑与左边为false,则不再进行逻辑与右边的判断,结果为false

② 当逻辑与左边为true,则进行右边判断,右边为false,结果为false

③ 当逻辑与左边为true,则进行右边判断,右边也为true,则结果为true

2) || (逻辑或):(三种)

① 当逻辑或左边为false,继续逻辑或右边的判断,如果也为false,结果为false

② 当逻辑或左边为false,继续逻辑或右边的判断,如果为true,结果为true

③ 当逻辑或左边为true,则不再进行逻辑或右边的判断,结果为true

看似好像都明白,但这题的题解可能会刷新你的认知

👍题解代码:

int sumNums(int n){
    n && (n += sumNums(n - 1));
    return n;
}

当n=0时递归不执行,但这段代码看似会死循环,但我们深入剖析就能一探究竟,&&语句中的n与return中的n并不是同一个n,当第一句代码执行时,程序开始递归,n-1传进递归中,此时第一层递归的n实际是n-1,而后继续直至n=0,然后开始返回每层递归的n值,这就是这串代码的含义。

🤷‍♀️题目二:

剑指 Offer 57 - II. 和为s的连续正数序列

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。

序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。

这题大体上并不难,用暴力查找即可,但一出问题的就是动态内存开辟,c语言中至关重要的两个点就是指针和动态内存管理

🧐知识点补充:

     

       🐰二维数组的实质:

 其实二维数组本质上还是一维数组,但它里面的元素是数组,这也解释了leetcode数组传参是出现二级指针的现象

     

      🐭 malloc函数的讲解:

malloc是动态内存分配函数,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址

函数原型:

extern void *malloc(unsigned int num_bytes)
;//num_bytes表示分配的长度
​

malloc如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。

重点:在使用malloc开辟空间时,使用完成一定要释放空间,如果不释放会造内存泄漏。 在使用malloc函数开辟的空间中,不要进行指针的移动,因为一旦移动之后可能出现申请的空间和释放空间大小的不匹配

使用形式:

mallo函数返回的实际是一个无类型指针,必须在其前面加上指针类型强制转换才可以使用 指针自身 = (指针类型)malloc(sizeof(指针类型)数据数量)

在使用malloc开辟一段空间之后,系统会在这段空间之前做一个标记(0或1),当malloc函数开辟空间如果遇到标记为0就在此开辟,如果为1说明此空间正在被使用。

   

       🐹 free函数讲解:

malloc函数后面通常是跟着free函数,所以一起进行讲解

作用:释放malloc(或calloc、realloc)函数给指针变量分配的内存空间。 注意:使用后该指针变量一定要重新指向NULL,防止悬空指针(失效指针)出现,有效规避错误操作。

    int *p = (int *)malloc(sizeof(int));
    *p = 100;
    free(p);
    p = NULL;
​

free函数在释放空间之后,把内存前的标志变为0,且为了防止数据泄露,它会把所释放的空间用cd进行填充。

👍解题代码:

int** findContinuousSequence(int target, int* returnSize, int** returnColumnSizes){
 int** result = (int**)malloc(sizeof(int*) * target);
int* col = (int*)malloc(sizeof(int) * target);
int t=target/2;
int i=0;int j=0;
int c=0;int size=0;
for(i=1;i<=t;i++)
{
    int i_=i;
    int sum=0;int count=0;
    while(1)
    {
        sum+=i_++;
        count++;
        if(sum>=target)
        break;
    }
    if(sum==target)
    {
      result[c]=(int*)malloc(sizeof(int*)* count);
      int k=0;
      for(j=i;j<=i+count;j++)
      {
        result[c][k++]=j;
      }
      col[c]=count;
      c++;
      size++;
    }
}
*returnColumnSizes=col;
*returnSize=size;
return result;
}

此题为暴力求解,数组中最大的数必定小于target/2,找到相加等于target的几个连续数后,再开辟空间然后放入数据,方法不难,但这二级指针和动态内存开辟会比较麻烦。

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shany-Ming

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值