大家好,我是吴师兄。
相比于其它行业,互联网求职尤其是程序员求职,学历的占比是最低的,在不少的互联网大厂里面,员工并非都是 211 以上的学历,都能做到资深开发或者管理的位置。
但最近几年,互联网里面也逐渐的变成了其它行业的样子,求职过程中的简历要过学历筛选,或者面试过程中实力同等的情况下,会优先淘汰学历低的面试者。
比如下面这个同学,都到蚂蚁四面了,说明技术等多项能力都得到了认可,但却还是被挂了,原因是学历不是 211 985,当然,或许真实原因是婉拒。
继续今天的算法学习,来一个简单的算法题:
最大连续 1 的个数
。
一、题目描述
给定一个二进制数组
nums
, 计算其中最大连续
1
的个数。
示例 1:
输入:nums = [1,1,0,1,1,1] 输出:3 解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.
示例 2:
输入:nums = [1,0,1,1,0,1] 输出:2
提示:
二、题目解析
在这个问题中,主要涉及到对数组的操作。数组是一种线性表数据结构,具有连续的内存空间,可以通过下标来访问其中的元素。
算法考察点
-
数组遍历:遍历数组是这个问题的核心操作,需要通过循环遍历数组元素。
-
指针操作:使用指针来记录当前处理的位置,可以减少不必要的移动操作。
-
最大连续子数组:需要求解最大连续 1 的个数,可以通过比较当前连续 1 的个数和历史最大值来更新结果。
算法思路
-
初始化变量
lastZero
为 -1,表示最后一个 0 所在的索引位置。
-
初始化结果变量
ans
为 0,表示最大连续 1 的个数。
-
从左到右遍历数组 nums,对于每个元素 num 和其索引 i :
-
如果当前元素为 0,则更新
lastZero
为当前索引
i
。
-
否则,如果当前元素为 1,则计算当前连续 1 的个数
i - lastZero
,并更新
ans
为历史最大值。
算法的优势
-
算法通过遍历一次数组即可得到结果,时间复杂度较低。
-
使用指针记录最后一个 0 的位置,避免了对数组进行频繁的遍历和计算,提高了效率。
算法的适用性
-
适用于需要求解最大连续 1 的个数的问题,时间复杂度与数组长度成线性关系。
易错点
-
遍历过程中需要注意索引的变化,确保
lastZero
指针始终指向最后一个 0 的位置。
-
在计算连续 1 的个数时,需要注意索引之间的差值,确保计算的是连续的 1。
类似的算法题
-
LeetCode 第 487 号问题:“最大连续 1 的个数 II”
-
给定一个二进制数组
nums
,你可以最多将 1 个 0 翻转为 1,找出其中最大连续 1 的个数。
-
LeetCode 第 1004 号问题:“最大连续 1 的个数 III”
-
给定一个由若干 0 和 1 组成的数组
A
,我们最多可以将
K
个值从 0 变成 1,返回仅包含 1 的最长(连续)子数组的长度。
-
LeetCode 第 424 号问题:“替换后的最长重复字符”
-
给定一个字符串
s
,以及一个正整数
k
,你需要将字符串中的某个字符(不限制个数),替换为任意其他字符,使得替换后的字符串中包含的最长连续字符长度最大,返回最大长度。
-
LeetCode 第 995 号问题:“K 连续位的最小翻转次数”
-
在一个长度为
N
的二进制数组
A
中,第
i
个元素表示
0
或
1
。返回最少的 K 位翻转的次数,以便将数组中的每个连续 K 位的值都反转为 0。
-
LeetCode 第 487 号问题:“超级丑数”
-
编写一段程序来查找第
n
个超级丑数。超级丑数是指其所有质因数都是长度为
k
的质数列表
primes
中的正整数的正整数。