专栏名称: 吴师兄学算法
和程序员小吴一起从初学者的角度学习算法,以动画的形式呈现解题的思路。每周四篇原创文章,期待你的鉴赏!
目录
相关文章推荐
古典文献学微刊  ·  编辑·手记 | ... ·  2 天前  
51好读  ›  专栏  ›  吴师兄学算法

蚂蚁四面挂,说我学历不是 211

吴师兄学算法  · 公众号  ·  · 2024-04-21 11:10

正文

大家好,我是吴师兄。

相比于其它行业,互联网求职尤其是程序员求职,学历的占比是最低的,在不少的互联网大厂里面,员工并非都是 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 <= nums.length <= 10^5
  • nums[i] 不是 0 就是 1 .

二、题目解析

在这个问题中,主要涉及到对数组的操作。数组是一种线性表数据结构,具有连续的内存空间,可以通过下标来访问其中的元素。

算法考察点

  1. 数组遍历:遍历数组是这个问题的核心操作,需要通过循环遍历数组元素。
  2. 指针操作:使用指针来记录当前处理的位置,可以减少不必要的移动操作。
  3. 最大连续子数组:需要求解最大连续 1 的个数,可以通过比较当前连续 1 的个数和历史最大值来更新结果。

算法思路

  1. 初始化变量 lastZero 为 -1,表示最后一个 0 所在的索引位置。
  2. 初始化结果变量 ans 为 0,表示最大连续 1 的个数。
  3. 从左到右遍历数组 nums,对于每个元素 num 和其索引 i :
  • 如果当前元素为 0,则更新 lastZero 为当前索引 i
  • 否则,如果当前元素为 1,则计算当前连续 1 的个数 i - lastZero ,并更新 ans 为历史最大值。
  • 遍历完成后,返回结果变量 ans
  • 算法的优势

    • 算法通过遍历一次数组即可得到结果,时间复杂度较低。
    • 使用指针记录最后一个 0 的位置,避免了对数组进行频繁的遍历和计算,提高了效率。

    算法的适用性

    • 适用于需要求解最大连续 1 的个数的问题,时间复杂度与数组长度成线性关系。

    易错点

    1. 遍历过程中需要注意索引的变化,确保 lastZero 指针始终指向最后一个 0 的位置。
    2. 在计算连续 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 中的正整数的正整数。






    请到「今天看啥」查看全文