路♂️题目一:
剑指 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的几个连续数后,再开辟空间然后放入数据,方法不难,但这二级指针和动态内存开辟会比较麻烦。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)