队列

作者: nadou23 | 来源:发表于2021-10-11 01:23 被阅读0次

1.最近的请求次数,属于窗口类题型,都是使用队列把前面不符合的去掉,再进行计算剩下的
int ping(int t) 在时间 t 添加一个新请求,其中 t 表示以毫秒为单位的某个时间,并返回过去 3000 毫秒内发生的所有请求数(包括新请求)。确切地说,返回在 [t-3000, t] 内发生的请求数。
解法:通过保持数据都是3000毫秒内的数据进行计数,换句话说就是每次 新t进来,就把3000毫秒外的删除。
用队列解决:

class RecentCounter {
 var queue = [Int]()
    init() {

    }

    func ping(_ t: Int) -> Int {
        if queue.count == 0 {
            return 1
        }
        while queue.first! > t - 3000 {
            queue.removeFirst()
        }
        return queue.count
    }
}

用数组的官方方法解决:时间为100%,内存77%

 var array = [Int]()
    init() {

    }

    func ping(_ t: Int) -> Int {
        array.removeAll {$0 < t - 3000  }
        array.append(t)
        return array.count
    }

2.[无法吃午餐的学生数量]
学校的自助午餐提供圆形和方形的三明治,分别用数字 0 和 1 表示。所有学生站在一个队列里,每个学生要么喜欢圆形的要么喜欢方形的。
餐厅里三明治的数量与学生的数量相同。所有三明治都放在一个 栈 里,每一轮:

如果队列最前面的学生 喜欢 栈顶的三明治,那么会 拿走它 并离开队列。
否则,这名学生会 放弃这个三明治 并回到队列的尾部。
这个过程会一直持续到队列里所有学生都不喜欢栈顶的三明治为止。

给你两个整数数组 students 和 sandwiches ,其中 sandwiches[i] 是栈里面第 i 个三明治的类型(i = 0 是栈的顶部), students[j] 是初始队列里第 j 名学生对三明治的喜好(j = 0 是队列的最开始位置)。请你返回无法吃午餐的学生数量。

解法:把喜欢吃午餐的学生分类,得到每类学生的个数,数组/字典表示,然后根据遍历三文治,根据元素把响应学生减少,直到一类学生个数为0,说明此轮此类三文治还有,但学生上轮已经轮完,没有了,那说明此类三文治已经无法被选完,所以说明游戏已经到了结束的时候,那这时可以返回各类学生的个数,也就是无法吃午餐的学生数。
数组解法:时间空间双100%。

func countStudents(_ students: [Int], _ sandwiches: [Int]) -> Int {
        // 分两类学生,喜欢圆形/方形
var stuLike = [Int](repeating: 0, count: 2)
        for x in students {
            // 把所有学生遍历分类
            stuLike[x] += 1
        }
        // 把三文治遍历,通过对应0,1 获取对应学生进行匹配减少
        for y in sandwiches {
            // 当其中一类学生为0,说明三文治还有,但喜欢此类别的学生已经没有了,说明三文治肯定无法被调完,退出遍历
            if stuLike[y] == 0 {
                break
            }
            stuLike[y] -= 1
        }
        // 此时返回的就是最终无法挑中喜欢三文治的两类学生总数
        return stuLike[0] + stuLike[1]
    }

字典解法,时间为33%,空间33%,不是最佳解法。

func countStudents(_ students: [Int], _ sandwiches: [Int]) -> Int {
       if  students.count == 0 {
            return 0
        }
        var map = [Int: Int]()
// 需要初始化两类为0
        map[0] = 0
        map[1] = 0
        for student in students {
           
            map[student]! += 1
          
        }
        for san in sandwiches {
            if map[san] == 0 {
                break
            }
            map[san]! -= 1
        }
        return (map[0] ?? 0) + (map[1] ?? 0)
    }

相关文章

  • 队列

    队列特性 对比队列和栈 基于数组的队列 对比队列学习循环队列 循环队列难点 阻塞队列 并发队列 应用:线程池中拒绝...

  • 队列

    文章结构 什么是队列 实现队列顺序队列链式队列循环队列 Java中的队列 1. 什么是队列 队列也是一种操作受限的...

  • iOS底层-- GCD源码分析(1)-- dispatch_qu

    手动目录认识队列队列的结构队列的产生主队列全局队列创建的队列管理队列 代码版本dispatch version :...

  • 队列,异步,同步,线程通俗理解

    一、队列 串行队列 并行队列 主队列(只在主线程执行的串行队列) 全局队列(系统的并行队列) 二、 任务(是否具有...

  • GCD基础总结一

    上代码~ 同步串行队列 同步并行队列 异步串行队列 异步并行队列 主队列同步 会卡住 主队列异步

  • OC多线程

    队列创建 线程与队列 队列线程间通信 队列组

  • GCD

    获得主队列 获得全局队列 串行队列 异步队列 同步队列 阻隔队列 (像栅栏一样 ) 例如 A -->栅栏 --...

  • 数据结构第三篇 队列

    队列的特性 前进先出。 我们来大致描述下进出队列的情况。 进队列 1 进队列现在队列是 12 进队列现在队列是 1...

  • 利用链表实现队列

    队列成员变量: 队列长度 队列头节点 队列尾节点队列方法: 队列包含元素个数 队列是否为空 进队操作 出队操作 d...

  • Git 常用操作命令(持续更新)

    当前更新到stash队列 查看stash队列 清空队列 删除某个队列

网友评论

      本文标题:队列

      本文链接:https://www.haomeiwen.com/subject/eookoltx.html