天融信 2023 的年终奖。。

天融信

过去几天,最大的瓜,是天融信 2023 的年终奖脚踝砍。

"天融信"是国内首家网络安全企业,同时也是一家上市公司。

就在前些天,有网友爆料出,天融信年终奖到账只有几百元,甚至只有几十元

alt

一时间,「传天融信年终奖打折,到账几百元」冲上热搜,目前仍占领职场类 App 的热搜第一:

alt

通常此类操作,如果是技术问题导致的搞错,到现在怎么都被辟谣了。

结果却越来越多网友参与到爆料中:

alt

当中不少带着天融信企业认证的网友分享道,连几十元都没有,而是 0 元年终:

alt

更离谱的是,这家搞网络安全的公司,0 元年终还专门发个短信通知一下,确实严谨。

对此,你怎么看?

...

回归主线。

来一道近期读者投稿,和「腾讯(社招二面)」相关的算法题。

题目描述

平台:LeetCode

题号:901

编写一个 StockSpanner 类,它收集某些股票的每日报价,并返回该股票当日价格的跨度。

今天股票价格的跨度被定义为股票价格小于或等于今天价格的最大连续日数(从今天开始往回数,包括今天)。

例如,如果未来 7 天股票的价格是 [100, 80, 60, 70, 60, 75, 85],那么股票跨度将是 [1, 1, 1, 2, 1, 4, 6]

示例:

输入:["StockSpanner","next","next","next","next","next","next","next"], [[],[100],[80],[60],[70],[60],[75],[85]]

输出:[null,1,1,1,2,1,4,6]

解释:
首先,初始化 S = StockSpanner(),然后:
S.next(100) 被调用并返回 1,
S.next(80) 被调用并返回 1,
S.next(60) 被调用并返回 1,
S.next(70) 被调用并返回 2,
S.next(60) 被调用并返回 1,
S.next(75) 被调用并返回 4,
S.next(85) 被调用并返回 6。

注意 (例如) S.next(75) 返回 4,因为截至今天的最后 4 个价格
(包括今天的价格 75) 小于或等于今天的价格。

提示:

  • 调用  StockSpanner.next(int price) 时,将有 
  • 每个测试用例最多可以调用  10000StockSpanner.next
  • 在所有测试用例中,最多调用  150000 次  StockSpanner.next
  • 此问题的总时间限制减少了 50%

分块

又名优雅的暴力。

这是一道在线问题,在调用 next 往数据流存入元素的同时,返回连续段不大于当前元素的数的个数。

一个朴素的想法是:使用数组 nums 将所有 price 进行存储,每次返回时往前找到第一个不满足要求的位置,并返回连续段的长度。

但对于 的调用次数来看,该做法的复杂度为 ,计算量为 ,不满足 OJ 要求。

实际上我们可以利用「分块」思路对其进行优化,将与连续段的比较转换为与最值的比较。

具体的,我们仍然使用 nums 对所有的 price 进行存储,同时使用 region 数组来存储每个连续段的最大值,其中 含义为块编号为 loc 的最大值为 x,其中块编号 loc 块对应了数据编号 idx 的范围

对于 next 操作而言,除了直接更新数据数组 nums[++idx] = price 以外,我们还需要更新 idx 所在块的最值 region[loc],然后从当前块 loc 开始往前扫描其余块,使用 leftright 代指当前处理到的块的左右端点,若当前块满足 region[loc] <= price,说明块内所有元素均满足要求,直接将当前块 loc 所包含元素个数累加到答案中,直到遇到不满足的块或达到块数组边界,若存在遇到不满足要求的块,再使用 rightleft 统计块内满足要求 nums[i] <= price 的个数。

对于块个数和大小的设定,是运用分块降低复杂度的关键,数的个数为 ,我们可以设定块大小为 ,这样也限定了块的个数为 个。这样对于单次操作而言,我们最多遍历进行 次的块间操作,同时最多进行一次块内操作,整体复杂度为 ,单次 next 操作计算量为 以内,单样例计算量为 ,可以过。

为了方便,我们令块编号 loc 和数据编号 idx 均从 开始;同时为了防止每个样例都 new 大数组,我们采用 static 优化,并在 StockSpanner 的初始化中做重置工作。

Java 代码:

class StockSpanner {
    static int N = 10010, len = 100, idx = 0;
    static int[] nums = new int[N], region = new int[N / len + 10];
    public StockSpanner() {
        for (int i = 0; i <= getIdx(idx); i++) region[i] = 0;
        idx = 0;
    }
    int getIdx(int x) {
        return (x - 1) / len + 1;
    }
    int query(int price) {
        int ans = 0, loc = getIdx(idx), left = (loc - 1) * len + 1, right = idx;
        while (loc >= 1 && region[loc] <= price) {
            ans += right - left + 1;
            loc--; right = left - 1; left = (loc - 1) * len + 1;
        }
        for (int i = right; loc >= 1 && i >= left && nums[i] <= price; i--) ans++;
        return ans;
    }
    public int next(int price) {
        nums[++idx] = price;
        int loc = getIdx(idx);
        region[loc] = Math.max(region[loc], price);
        return query(price);
    }
}

TypeScript 代码:

class StockSpanner {
    N: number = 10010; sz: number = 100; idx: number = 0
    nums: number[] = new Array<number>(this.N).fill(0);
    region = new Array<number>(Math.floor(this.N / this.sz) + 10).fill(0)
    getIdx(x: number): number {
        return Math.floor((x - 1) / this.sz) + 1
    }
    query(price: number): number {
        let ans = 0, loc = this.getIdx(this.idx), left = (loc - 1) * this.sz + 1, right = this.idx
        while (loc >= 1 && this.region[loc] <= price) {
            ans += right - left + 1
            loc--; right = left - 1; left = (loc - 1) * this.sz + 1
        }
        for (let i = right; loc >= 1 && i >= left && this.nums[i] <= price; i--) ans++
        return ans
    }
    next(price: number): number {
        this.nums[++this.idx] = price
        const loc = this.getIdx(this.idx)
        this.region[loc] = Math.max(this.region[loc], price)
        return this.query(price)
    }
}

Python3 代码:

class StockSpanner:
    def __init__(self):
        self.N, self.sz, self.idx = 100101100
        self.nums, self.region = [0] * self.N, [0] * (self.N // self.sz + 10)

    def next(self, price: int) -> int:
        def getIdx(x):
            return (x - 1) // self.sz + 1

        def query(price):
            ans, loc = 0, getIdx(self.idx)
            left, right = (loc - 1) * self.sz + 1, self.idx
            while loc >= 1 and self.region[loc] <= price:
                ans += right - left + 1
                loc -= 1
                right, left = left - 1, (loc - 1) * self.sz + 1
            while loc >= 1 and right >= left and self.nums[right] <= price:
                right, ans = right - 1, ans + 1
            return ans

        self.idx += 1
        loc = getIdx(self.idx)
        self.nums[self.idx] = price
        self.region[loc] = max(self.region[loc], price)
        return query(price)
  • 时间复杂度:由于使用了 static 优化, StockSpanner 初始化时,需要对上一次使用的块进行重置,复杂度为 ;由于块大小和数量均为 next 操作复杂度为
  • 空间复杂度:

单调栈

另外一个容易想到的想法是使用「单调栈」,栈内以二元组 形式维护比当前元素 price 大的元素。

每次执行 next 操作时,从栈顶开始处理,将所有满足「不大于 price」的元素进行出栈,从而找到当前元素 price 左边最近一个比其大的位置。

Java 代码:

class StockSpanner {
    Deque<int[]> d = new ArrayDeque<>();
    int cur = 0;
    public int next(int price) {
        while (!d.isEmpty() && d.peekLast()[1] <= price) d.pollLast();
        int prev = d.isEmpty() ? -1 : d.peekLast()[0], ans = cur - prev;
        d.addLast(new int[]{cur++, price});
        return ans;
    }
}

TypeScript 代码:

class StockSpanner {
    stk = new Array<Array<number>>(10010).fill([00])
    he = 0; ta = 0; cur = 0
    next(price: number): number {
        while (this.he < this.ta && this.stk[this.ta - 1][1] <= price) this.ta--
        const prev = this.he >= this.ta ? -1 : this.stk[this.ta - 1][0], ans = this.cur - prev
        this.stk[this.ta++] = [this.cur++, price]
        return ans
    }
}

Python3 代码:

class StockSpanner:
    def __init__(self):
        self.stk = []
        self.cur = 0

    def next(self, price: int) -> int:
        while self.stk and self.stk[-1][1] <= price:
            self.stk.pop()
        prev = -1 if not self.stk else self.stk[-1][0]
        ans = self.cur - prev
        self.stk.append([self.cur, price])
        self.cur += 1
        return ans
  • 时间复杂度: next 操作的均摊复杂度为
  • 空间复杂度:

最后

给大伙通知一下 📢 :

全网最低价 LeetCode 会员目前仍可用 ~

📅 年度:有效期加赠两个月!!; 季度:有效期加赠两周!!

🧧 年度:获 66.66!!; 季度:获 22.22!!

🎁 年度:参与当月丰厚专属实物抽奖(中奖率 > 30%)!!

专属链接:leetcode.cn/premium/?promoChannel=acoier

我是宫水三叶,每天都会分享算法知识,并和大家聊聊近期的所见所闻。

欢迎关注,明天见。

更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地 🎉🎉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/674964.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

铝包木门窗性能优异 国内产量及需求量总体呈增长态势

铝包木门窗性能优异 国内产量及需求量总体呈增长态势 铝包木门窗是在保留纯实木门窗特性和功能的前提下&#xff0c;将隔热断桥铝合金型材和实木通过机械方法复合而成的框体。铝包木门窗具有良好的密封性、保温性、抗腐蚀性、隔音性等&#xff0c;能够满足市场对门窗质量要求不…

【Linux-阻塞,非阻塞,异步】

Linux-阻塞&#xff0c;非阻塞&#xff0c;异步 ■ Linux-阻塞-非阻塞 IO-异步■ Linux-阻塞IO■ 阻塞IO简介■ open■ 等待队列■ 示例一&#xff1a;APP阻塞IO读取进入睡眠后-等待队列唤醒进程■■ ■ Linux-非阻塞IO■ 非阻塞IO简介■ open■ 轮询■ 1、select 函数■ 2、po…

【轻触按键】开关机电路--填坑1

接上文&#xff0c;挖的坑 一、翻转电路 二、真值表 按键按下去&#xff0c;1G17会拉低&#xff0c;A端脚会掉电&#xff0c;下降沿&#xff1b;终到逻辑“0” 松开按键&#xff0c;1G17会拉高&#xff0c;A端脚充电&#xff0c;上升沿&#xff1b;终到逻辑“1”&#xff1b; …

[补题记录]LeetCode 6.Z字形变换

传送门&#xff1a;Z字形变换 转自&#xff1a;Z字形变换 Thought/思路 关键点在于&#xff0c;最后的答案是一行行连接起来的。 这样我们就会发现&#xff0c;这个 Z 字&#xff0c;实际上会让行数 不断加 1&#xff0c;然后又 不断减 1。每次按顺序选择 S 中的一个字符即…

visual studio打包qt算子时,只生成dll没有生成lib等文件

问题&#xff1a;在visual studio配置了qt项目&#xff0c;并打包成dll&#xff0c;原则上会生成一堆文件&#xff0c;包括dll,lib等文件。 解决办法&#xff1a; 挨个右击源代码的所有头文件-》属性-》项类型。改成qt头文件形式&#xff0c;如下。

961题库 北航计算机 计算机网络 附答案 简答题形式

有题目和答案&#xff0c;没有解析&#xff0c;不懂的题问大模型即可&#xff0c;无偿分享。 第1组 习题 某网络拓扑如题下图所示&#xff0c;其中 R 为路由器&#xff0c;主机 H1&#xff5e;H4 的 IP 地址配置以及 R 的各接口 IP 地址配置如图中所示。现有若干以太网交换机…

C#中使用Mapster

Mapster是一个开源的.NET对象映射库&#xff0c;它提供了一种简单而强大的方式来处理对象之间的映射。 多个映射框架的性能对比&#xff1a; 第一步安装Mapster 使用方法 public class Test {public string name { get; set; }public string sex { get; set; }public string…

光伏并网逆变器UL 1741:2021标准解析

光伏并网逆变器UL 1741:2021标准解析 不同国家的安规认证可以说是光伏逆变器走向国际市场的一张通行证&#xff0c;由于全球各国家的电网制式及并网政策的不同差异&#xff0c;这对逆变器测试顺利的通过安规测试认证 还是有一定的技术难度&#xff0c;也是中国光伏制造企业迫切…

在Linux中tomcat占用内存过高可以通过导出hprof日志来解决

自动导出hprof日志 第一种方法&#xff1a; Tomcat的hprof日志是一种用于分析Java堆内存使用情况的工具&#xff0c;它可以帮助开发人员找到内存泄漏的原因。 hprof日志可以在特定的时间点对Java堆内存进行快照&#xff0c;并生成详细的分析报告。 启用hprof日志导出的具体…

零基础写框架:从零设计一个模块化和自动服务注册框架

模块化和自动服务注册 基于 ASP.NET Core 开发的 Web 框架中&#xff0c;最著名的是 ABP&#xff0c;ABP 主要特点之一开发不同项目(程序集)时&#xff0c;在每个项目中创建一个模块类&#xff0c;程序加载每个程序集中&#xff0c;扫描出所有的模块类&#xff0c;然后通过模块…

“去员工化”这个潮流谁也挡不住,六大诱因分析。

去员工化→恐怕是未来工作的主流&#xff0c;一方面有成本的原因&#xff0c;另一方面也有技术进步、雇佣形式创新等原因&#xff0c;这个潮流有利也有弊&#xff0c;关键看我们是如何兴利除弊。 "去员工化"是指企业在运营中减少或取消传统雇佣制度&#xff0c;更多…

HOW - vscode 使用指南

目录 一、基本介绍1. 安装 VS Code2. 界面介绍3. 扩展和插件4. 设置和自定义 二、常用界面功能和快捷操作&#xff08;重点&#xff09;常用界面功能快捷操作 三、资源和支持 Visual Studio Code&#xff08;VS Code&#xff09;是一款由微软开发的免费、开源的代码编辑器&…

vue开发网站-使用插件element、vant 遇到的问题

1. js把两个字符串放进一个另字符串里&#xff0c;用逗号分隔 let string1 "Hello"; let string2 "World"; let result ${string1},${string2}; console.log(result); // 输出: Hello,World2.js将字符串转为数组 const str "Hello, world!"…

HBuilder中怎样修改每次输出的内容hello?每次修改之后再次“运行到”的时候,怎样保证每次都重新编译?

要修改每次输出的内容&#xff0c;可以在代码中找到输出的地方&#xff0c;并将内容进行修改。例如&#xff0c;在JavaScript中&#xff0c;可以使用console.log()函数输出内容。在修改内容后&#xff0c;保存代码。 为了保证每次运行都重新编译代码&#xff0c;可以按照以下步…

LeetCode 算法:接雨水c++

原题链接&#x1f517;&#xff1a;接雨水 难度&#xff1a;困难⭐️⭐️⭐️ 题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,…

使用 WM_WINDOWPOSCHANGING 跟踪窗口状态变化

在窗口位置变化过程的早期&#xff0c;系统会发送 WM_WINDOWPOSCHANGING 消息。 这个和 WM_WINDOWPOSCHANGED 消息不同&#xff0c;WM_WINDOWPOSCHANGED 消息发生在窗口位置变化之后。 一个关键的区别&#xff08;除了时间之外&#xff09;是&#xff0c;您可以通过处理 WM_WI…

OpenStreetMap部署(OSM)

参考&#xff1a;https://github.com/openstreetmap/openstreetmap-website/blob/master/DOCKER.md OpenStreeMap 部署 操作系统建议使用 Ubuntu 22 版本 安装 Docker # 更新软件包索引&#xff1a; sudo apt-get update # 允许APT使用HTTPS&#xff1a; sudo apt-get inst…

艰难求生的转型之路

起因 我个人“工作水平低&#xff0c;专业能力差。”是最核心的困难。 在坚持了快十年之后&#xff0c;博客从2015-2024。 2015201620172018201920202021202220232024 从2020年之后就已经开始全面转型之路。 所有传统赛道&#xff0c;都挤满了人&#xff0c;各种限制各种约…

【图像处理与机器视觉】灰度变化与空间滤波

基础 空间域与变换域 空间域&#xff1a;认为是图像本身&#xff0c;对于空间域的操作就是对图像中的像素直接进行修改 变换域&#xff1a;变换系数处理&#xff0c;不直接对于图像的像素进行处理 邻域 图像中某点的邻域被认为是包含该点的小区域&#xff0c;也被称为窗口 …

【Linux基础】安装redis

【Linux基础】安装redis 文章目录 【Linux基础】安装redis1、安装redis步骤2、启动redis3、redis停止 1、安装redis步骤 创建文件夹存放软件目录 [rootlocalhost ~]# mkdir /sort将Redis安装包上传到Linux到soft目录 解压安装包 cd /soft tar -xvf redis-4.0.0.tar.gz -C /usr/…