栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

力扣复健|简单|数组|485.最大连续 1 的个数

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

力扣复健|简单|数组|485.最大连续 1 的个数

目录

一、题目描述

二、代码编写

1.第一次

2.第二次

3.第三次

三、代码优化及思考


一、题目描述

给定一个二进制数组, 计算其中最大连续 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 );

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/291050.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号