笔试面试题目:滑动窗口(一)

算法:

这是滑动窗口的经典题目,通过题目我们可以将题目拆解成两步:

一、如何进行窗口的滑动。

这里我们可以采用双指针的方法,left不变的时候,
找到不重复的元素的右指针位置,那么窗口大小为right-left+1。

二、如何进行重复元素的判断。

我们采用hash的方式, 也就是golang中的map。
1.在移动left的时候,我们从map中移除没有移动之前的元素,也就是left-1那个位置的元素。
2.在移动right的时候,只要right对应的元素在map不存在,那么就存到map里面,并且后移right;
否则跳出循环,这里的right也就是本次窗口的最右侧位置。

题目:
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

leetcode的官方题目分析:

代码实现:

func lengthOfLongestSubstring(s string) int {
   // map用来判断是不是有重复的元素
   m := map[byte]int{}
   num := len(s)
   // 右指针=-1表示什么都没操作,窗口大小一定>0,所以这里初始化为0
   right,result := -1,0
   for left :=0;left<num;left++ {
       if left != 0 {
       // 左指针向右移动一格,移除前面的那一个元素,例如:left =1之后,移除left=0的元素
           delete(m,s[left-1])
       }
       // 每一次操作,右指针从[left,right]都是不重复的元素了,所以从right=1开始
       for  right+1<num&&m[s[right+1]]==0{
           right++ 
           m[s[right]]++
       }
      
       result = max(result,right-left+1)
   }
   return result
}


func max(num1, num2 int) int {
    if num1>num2 {
        return num1
    }
    return num2
}

执行结果:

备注:这里双指针的解决并不是滑动窗口的最优解法,不过确实最常用的解法,也比较容易想到,这也是笔者整理这一思路的主要原因。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CSDN嵌入式笔试面试题系列是CSDN提供的面向嵌入式系统工程师的一系列笔试,旨在评估面试者在嵌入式领域的知识和技能。 这些面试题涵盖了嵌入式系统的各个方面,包括硬件设计、嵌入式软件开发、嵌入式操作系统等。通过回答这些题,面试者可以展示他们的专业知识、问题解决能力和团队协作能力。 作为一个嵌入式系统工程师,我会通过以下几个方面来回答这一系列的面试题: 1. 硬件设计:我会解释如何设计一个嵌入式系统的硬件架构,包括选择核心处理器、外设接口的设计和电路设计等。 2. 嵌入式软件开发:我会谈谈自己的嵌入式软件开发经验,包括使用哪些开发工具和编程语言,如何进行软件调试和优化。 3. 嵌入式操作系统:我会介绍我在嵌入式操作系统方面的经验和知识,包括熟悉的操作系统类型,如RTOS和Linux,以及如何进行任务调度和内存管理等。 4. 项经验:我会分享我在嵌入式项中的经验,包括完成的项类型、任务分工和团队合作等。 5. 学习与发展:我会表达自己对嵌入式领域的学习态度和发展意愿,包括对新技术的关注和学习计划等。 综上所述,CSDN嵌入式笔试面试题系列是一系列用来评估嵌入式系统工程师技能的笔试。通过回答这些题,面试者可以展示他们的专业知识和技能,并展示自己在嵌入式领域的学习态度和发展潜力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值