目录
一、题目描述
二、代码编写
1.第一次
2.第二次
3.第三次
三、代码优化及思考
一、题目描述
给定一个二进制数组, 计算其中最大连续 1 的个数。
给定一个二进制数组, 计算其中最大连续 1 的个数。
示例:
输入:[1,1,0,1,1,1] 输出:3 解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.
提示:
- 输入的数组只包含 0 和 1 。
- 输入数组的长度是正整数,且不超过 10,000。
涉及知识点:数组遍历
使用语言:C
二、代码编写
1.第一次
此时距离上一次写码已经过去了很久,对于C也忘记了很多,题目给了一个
int findMaxConsecutiveOnes(int* nums, int numsSize){}
这样的函数框架,因为代码知识忘记了很多,所以不知道参数int* nums传进来的这个nums数组可以直接nums[1]这样引用,所以想的是定义一个指针p指向nums[0],然后把指针当数组用,后来想想二者的本质其实差不多。
初次的想法是遍历数组,如果是1则count++,然后如果下一个是0则清空count。
第一次的错误代码如下:
int findMaxConsecutiveOnes(int* nums, int numsSize){
int count = 0,max = 0;
int i;
int *p = nums;
for(i=0; i
报错:
ERROR: AddressSanitizer: heap-buffer-overflow on address 0x603000000028 at pc 0x563e266457e2 bp 0x7ffccdbb1ad0 sp 0x7ffccdbb1ac0
后来查阅了一下是因为数组越界。
2.第二次
在查资料的时候发现nums其实是可以直接用的,以为数组越界是指针导致的,于是便去掉了指针,代码如下:
int findMaxConsecutiveOnes2(int* nums, int numsSize){
int count = 0,max = 0;
int i;
for(i=0; i
同样也存在上述问题,仔细看了一下代码发现应该是nums[i+1]的问题。
3.第三次
int findMaxConsecutiveOnes(int* nums, int numsSize){
int count = 0,max = 0;
int i;
for(i=0; i
测试通过。
三、代码优化及思考
对比官方题解,他在比较两个数大小的时候用的是一个函数fmax(),而我则不知道运用函数,因为之前学C的时候,作业题经常会要求编写一些功能,所以对于一些简单的功能,我的下意识反应往往是自己编写。
官方代码如下:
int findMaxConsecutiveOnes(int* nums, int numsSize) {
int maxCount = 0, count = 0;
for (int i = 0; i < numsSize; i++) {
if (nums[i] == 1) {
count++;
} else {
maxCount = fmax(maxCount, count);
count = 0;
}
}
maxCount = fmax(maxCount, count);
return maxCount;
}
对于函数fmax(),在头文件中定义:
float fmaxf( float x, float y );
double fmax( double x, double y );



