壹 ❀ 引

今天来做一道十分烦躁的题目,为什么烦躁,因为我字母写错了提交了三次错了三次!!!我的leetcode正确率大大下降!!那么这道题是leetcode的485. 最大连续1的个数,题目描述如下:

给定一个二进制数组, 计算其中最大连续1的个数。

示例 1:

输入: [1,1,0,1,1,1]
输出: 3

解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3.

注意:

输入的数组只包含 0 和1

输入数组的长度是正整数,且不超过 10,000。

我们先简单分析题目,说说我的实现思路,最后再给出优质题解。

贰 ❀ 解题思路

首先很重要的一点,数组只包含数字0或1,而且数组的长度是正整数,也就是大于0的整数,所以数组至少有一位,那么我们就得考虑只有0像[0],或者[0,0,0,0,0,0,0]以及只有1的情况[1,1,1,1,1,1]

我首先想到的就是用正则,我们先将数组转成字符串,然后用正则/1+/g来匹配,+表示至少出现一次,比如:

'111011'.match(/1+/g);// ["111", "11"]

那我们只需要将匹配的结果按长度排个序,取最后一位就好了:

["111", "11"].sort((a,b) => {
return a.length - b.length;
});

那我们就直接贴代码:

/**
* @param {number[]} nums
* @return {number}
*/
var findMaxConsecutiveOnes = function (nums) {
// 假设数组全部是1,那么直接返回数组length即可
if (nums.indexOf(0) < 0) {
return nums.length;
};
// 如果数组全部是0,那就直接返回0
if (nums.indexOf(1) < 0) {
return 0;
};
var nums_ = nums.join("").match(/1+/g).sort(function (a, b) {
return a.length - b.length;
});
return nums_[nums_.length - 1].length;
};

我的提交错误一次就是没考虑[0]的情况,由于match匹配失败返回null,null.sort直接报错了...阿西吧。

那么第二种做法其实与正则类似,还是将数组转成字符串,然后按0进行切割,同样排序后取最后一位,这里就直接上代码,思路与上方相同:

/**
* @param {number[]} nums
* @return {number}
*/
var findMaxConsecutiveOnes = function (nums) {
if (nums.indexOf(0) < 0) {
return nums.length;
};
if (nums.indexOf(1) < 0) {
return 0;
};
var nums_ = nums.join("").split(0).sort(function (a, b) {
return a.length - b.length;
});
return nums_[nums_.length - 1].length;
};

虽然达到了效果,很遗憾这两种实现的实现都较慢,像这样:

由于这道题属于双指针分类,我想着怎么用双指针来解决这个问题,苦思冥想确实没想到好的办法,然后在看了优质解答后,顿时发现与双指针完全没啥关系....思想受限。

叁 ❀ 更优做法

直接贴代码:

/**
* @param {number[]} nums
* @return {number}
*/
var findMaxConsecutiveOnes = function (nums) {
// 计数器,每次遇到1让其自增
let count = 0;
// 当遇到0,就比较count与maxCount,将较大的值赋予maxCount
let maxCount = 0;
for (let i = 0; i < nums.length; i++) {
if (nums[i] === 1) {
count += 1;
} else if (nums[i] == 0) {
maxCount = Math.max(count, maxCount);
count = 0;
};
};
maxCount = Math.max(count, maxCount);
return maxCount;
};

我想大家看了代码思路就很清晰了,以[1,1,1,0,1]为例:

一开始count为0,遇到第一个1,自增count变成1,又连续遇到2个1,此时count变成了3。

接下来遇到了0,所以我们得重置count,重置前将count与maxCount较大的数赋予maxCount,所以此时maxCount为3。

接着遍历,又遇到1,count变成1。由于遍历完成,再次比较count与maxCount,1与3之间3更大,所以最终返回了3。

思路很简单,但是我确实没想上去,那么关于此题分析就到这里了。

JS leetcode 最大连续1的个数 题解分析的更多相关文章

  1. [LeetCode]最大连续1的个数

    题目 代码 class Solution { public: int findMaxConsecutiveOnes(vector<int>& nums) { int length= ...

  2. 领扣(LeetCode)最大连续1的个数 个人题解

    给定一个二进制数组, 计算其中最大连续1的个数. 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3. 注意: 输入的数组 ...

  3. [LeetCode] Max Consecutive Ones II 最大连续1的个数之二

    Given a binary array, find the maximum number of consecutive 1s in this array if you can flip at mos ...

  4. [LeetCode] Max Consecutive Ones 最大连续1的个数

    Given a binary array, find the maximum number of consecutive 1s in this array. Example 1: Input: [1, ...

  5. Leetcode 485. 最大连续1的个数

    1.题目描述(简单题) 给定一个二进制数组, 计算其中最大连续1的个数. 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 ...

  6. LeetCode(485. 最大连续1的个数)

    问题描述 给定一个二进制数组, 计算其中最大连续1的个数. 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3. 注意: ...

  7. Leetcode 1004. 最大连续1的个数 III

    1004. 最大连续1的个数 III  显示英文描述 我的提交返回竞赛   用户通过次数97 用户尝试次数143 通过次数102 提交次数299 题目难度Medium 给定一个由若干 0 和 1 组成 ...

  8. Java实现 LeetCode 485 最大连续1的个数

    485. 最大连续1的个数 给定一个二进制数组, 计算其中最大连续1的个数. 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数 ...

  9. 【leetCode】485. 最大连续1的个数

    给定一个二进制数组, 计算其中最大连续1的个数. 示例 1: 输入: [1,1,0,1,1,1]输出: 3解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3.注意: 输入的数组只包含 ...

  10. C#LeetCode刷题之#485-最大连续1的个数(Max Consecutive Ones)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3714 访问. 给定一个二进制数组, 计算其中最大连续1的个数. ...

随机推荐

  1. 01-module/分频器/激励写法

    1.module module有出入接口,输出接口 module有时钟和复位 // input clock; rest_n; // n表示低电平复位 //output o_data; module m ...

  2. [转帖]Linux cache参数调优

    https://zhuanlan.zhihu.com/p/136237953 缓存机制(cache)是保证Linux环境下对硬盘/flash操作效率的有效方式.cache建立在内存中,它缓存了硬盘/f ...

  3. [转帖]OJDBC版本区别 [ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别]

    classes12.jar,ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别,之间的差异 在使用Oracle JDBC驱动时,有些问题你是不是通过替换不同版本的Oracle  ...

  4. [转帖]jmeter学习笔记(二十二)——监听器插件之jp@gc系列

    一.jp@gc - Actiive Threads Over Time 不同时间活动用户数量展示 下面是一个阶梯加压测试的图标   二.jp@gc - Transactions per Second ...

  5. 物理机和虚拟机上CPU睿频的区别

    物理机和虚拟机上CPU睿频的区别 关于睿频 睿频是指当启动一个运行程序后,处理器会自动加速到合适的频率, 而原来的运行速度会提升 10%~20% 以保证程序流畅运行的一种技术. 一般max的睿频不能超 ...

  6. [转帖]一文入门前景广阔的 eBPF

    https://zhuanlan.zhihu.com/p/567375673 [摘要]eBPF带来的最大的好处即是可以对内核进行编程性处理,实现对内核中不灵活的部分,实现自定义的处理.这种灵活性使得对 ...

  7. [转帖]/etc/profile和/etc/environment的区别

    时间  2019-11-07 标签 profile environment 区别 繁體版 原文   https://my.oschina.net/u/2885925/blog/2989579 /etc ...

  8. 查看dmesg 里面部分内容的精确时间

    for i in `dmesg |grep "stuck for" |awk '{print $1}' |awk -F "." '{print $1}' |aw ...

  9. sed 删除部分行以及删除包含某些行的命令

    sed的简单学习 前言: 最近进行mysql数据库的备份恢复操作,发现source 命令执行时数据库表的速度非常缓慢, 本来想通过这种方式处理一下,能够减少数据备份的处理. 删除包含内容的信息 sed ...

  10. SignalR系列文章02---netCoreMvc创建Demo

    1.  新建.net core MVC项目,并引入nuget包 2.  添加客户端库 3.  修改startUp.cs文件,增加services.AddSignalR();和endpoints.Map ...