这才几天,京东又又又又又又加薪了!

news2024/11/15 10:20:25

京东

今天的最新消息,京东又又又又又加薪了。

距离我们 京东宣布大幅上调校招薪资 的推文发布才一周多点的时间,京东又宣布加薪了。

alt

好家伙,算上这次,光 2024 年京东就已经宣布了 6 次调薪了:

  • 2024 年初,京东零售全员平均加薪不低于 20%;
  • 2024-01-01 起,京东采销等一线业务人员的年固定薪酬翻倍(平均涨幅 100%);
  • 2024-02-01 起,京东一线客服人员(超 2W 人)实现全年平均薪酬上涨 30%;
  • 2024-07-01 起,京东销售将用 18 个月时间,将年度固定薪酬从 16 薪提升至 20 薪,同时调整业绩激励上不封顶;
  • 2024 年 8 月,京东 2025 校园招聘全球启动,大幅上调校招薪资(算法岗平均起薪涨幅超 75%,硬件和设计等岗位起薪涨幅超 50%),开放 1.8W 个岗位招聘;
  • 2024-10-01,京东零售集团和职能体系将用两年时间实现 20 薪;

而且从本次的通告来看,京东的加薪行动还会不断持续。

这是比裁员"恶意"赔偿更加炸裂的行为,我愿称之为"恶意"加薪。

对此,你怎么看?

...

回归主题。

来一道和「京东」相关的算法原题。

题目描述

平台:LeetCode

题号:220

给你一个整数数组 nums 和两个整数 kt

请你判断是否存在两个不同下标 ij,使得 abs(nums[i]-nums[j])<=t,同时又满足 abs(i-j)<=k

如果存在则返回 true,不存在返回 false

示例 1:

输入:nums = [1,2,3,1], k = 3, t = 0

输出:true

示例 2:

输入:nums = [1,0,1,1], k = 1, t = 2

输出:true

示例 3:

输入:nums = [1,5,9,1,5,9], k = 2, t = 3

输出:false

提示:

滑动窗口 & 二分

根据题意,对于任意一个位置 i(假设其值为 u),我们其实是希望在下标范围为 内找到值范围在 的数。

一个朴素的想法是每次遍历到任意位置 i 的时候,往后检查 k 个元素,但这样做的复杂度是 的,会超时。

显然我们需要优化「检查后面 k 个元素」这一过程。

我们希望使用一个「有序集合」去维护长度为 k 的滑动窗口内的数,该数据结构最好支持高效「查询」与「插入/删除」操作:

  • 查询:能够在「有序集合」中应用「二分查找」,快速找到「小于等于 的最大值」和「大于等于 u 的最小值」(即「有序集合」中的最接近 u 的数)。
  • 插入/删除:在往「有序集合」添加或删除元素时,能够在低于线性的复杂度内完成(维持有序特性)。

或许你会想到近似 操作的 HashMap,但注意这里我们需要找的是符合 的两个值,nums[i]nums[j] 并不一定相等,而 HashMap 无法很好的支持「范围查询」操作。

我们还会想到「树」结构。

例如 AVL,能够让我们在最坏为 的复杂度内取得到最接近 u 的值是多少,但本题除了「查询」以外,还涉及频繁的「插入/删除」操作(随着我们遍历 nums 的元素,滑动窗口不断右移,我们需要不断的往「有序集合」中删除和添加元素)。

简单采用 AVL 树,会导致每次的插入删除操作都触发 AVL 的平衡调整,一次平衡调整会伴随着若干次的旋转。

而红黑树则很好解决了上述问题:将平衡调整引发的旋转的次数从「若干次」限制到「最多三次」。

因此,当「查询」动作和「插入/删除」动作频率相当时,更好的选择是使用「红黑树」。

也就是对应到 Java 中的 TreeSet 数据结构(基于红黑树,查找和插入都具有折半的效率)。

alt

其他细节:由于 nums 中的数较大,会存在 int 溢出问题,我们需要使用 long 来存储。

Java 代码:

class Solution {
    public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
        int n = nums.length;
        TreeSet<Long> ts = new TreeSet<>();
        for (int i = 0; i < n; i++) {
            Long u = nums[i] * 1L;
            // 从 ts 中找到小于等于 u 的最大值(小于等于 u 的最接近 u 的数)
            Long l = ts.floor(u); 
            // 从 ts 中找到大于等于 u 的最小值(大于等于 u 的最接近 u 的数)
            Long r = ts.ceiling(u); 
            if(l != null && u - l <= t) return true;
            if(r != null && r - u <= t) return true;
            // 将当前数加到 ts 中,并移除下标范围不在 [max(0, i - k), i) 的数(维持滑动窗口大小为 k)
            ts.add(u);
            if (i >= k) ts.remove(nums[i - k] * 1L);
        }
        return false;
    }
}

C++ 代码:

class Solution {
public:
    bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
        int n = nums.size();
        set<long long> ts;
        for (int i = 0; i < n; i++) {
            long long u = static_cast<long long>(nums[i]);
            auto l = ts.lower_bound(u), r = ts.upper_bound(u);
            if (l != ts.end() && *l - u <= t) return true;
            if (r != ts.begin() && u - *(--r) <= t) return true;
            ts.insert(u);
            if (i >= k) ts.erase(static_cast<long long>(nums[i - k]));
        }
        return false;
    }
};

Python 代码:

from sortedcontainers import SortedList

class Solution:
    def containsNearbyAlmostDuplicate(self, nums, k, t):
        n = len(nums)
        ts = SortedList()
        for i in range(n):
            u = nums[i]
            idx = ts.bisect_left(u)
            if idx < len(ts) and ts[idx] - u <= t:
                return True
            if idx > 0 and u - ts[idx - 1] <= t:
                return True
            ts.add(u)
            if i >= k:
                ts.remove(nums[i - k])
        return False
  • 时间复杂度: TreeSet 基于红黑树,查找和插入都是 复杂度。整体复杂度为
  • 空间复杂度:

桶排序

上述解法无法做到线性的原因是:我们需要在大小为 k 的滑动窗口所在的「有序集合」中找到与 u 接近的数。

如果我们能够将 k 个数字分到 个桶的话,那么我们就能 的复杂度确定是否有 的数字(检查目标桶是否有元素)。

具体的做法为:令桶的大小为 ,根据 u 计算所在桶编号:

  • 如果已经存在该桶,说明前面已有 范围的数字,返回 true
  • 如果不存在该桶,则检查相邻两个桶的元素是有 范围的数字,如有 返回 true
  • 建立目标桶,并删除下标范围不在 内的桶

Java 代码:

class Solution {
    long size;
    public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
        int n = nums.length;
        Map<Long, Long> map = new HashMap<>();
        size = t + 1L;
        for (int i = 0; i < n; i++) {
            long u = nums[i] * 1L;
            long idx = getIdx(u);
            // 目标桶已存在(桶不为空),说明前面已有 [u - t, u + t] 范围的数字
            if (map.containsKey(idx)) return true;
            // 检查相邻的桶
            long l = idx - 1, r = idx + 1;
            if (map.containsKey(l) && u - map.get(l) <= t) return true;
            if (map.containsKey(r) && map.get(r) - u <= t) return true;
            // 建立目标桶
            map.put(idx, u);
            // 移除下标范围不在 [max(0, i - k), i) 内的桶
            if (i >= k) map.remove(getIdx(nums[i - k] * 1L));
        }
        return false;
    }
    long getIdx(long u) {
        return u >= 0 ? u / size : ((u + 1) / size) - 1;
    }
}

C++ 代码:

class Solution {
public:
    long long size;
    bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
        size = t + 1;
        unordered_map<long longlong longmap;
        int n = nums.size();
        for (int i = 0; i < n; i++) {
            long long u = static_cast<long long>(nums[i]);
            long long idx = getIdx(u);
            if (map.count(idx)) return true;
            if (map.count(idx - 1) && u - map[idx - 1] <= t) return true;
            if (map.count(idx + 1) && map[idx + 1] - u <= t) return true;
            map[idx] = u;
            if (i >= k) map.erase(getIdx(static_cast<long long>(nums[i - k])));
        }
        return false;
    }
    long long getIdx(long long u) {
        return u >= 0 ? u / size : ((u + 1) / size) - 1;
    }
};

Python 代码:

class Solution:
    def containsNearbyAlmostDuplicate(self, nums, k, t):
        size = t + 1
        mapping = {}
        for i, u in enumerate(nums):
            idx = self.getIdx(u, size)
            if idx in mapping:
                return True
            if (idx - 1in mapping and u - mapping[idx - 1] <= t:
                return True
            if (idx + 1in mapping and mapping[idx + 1] - u <= t:
                return True
            mapping[idx] = u
            if i >= k:
                del mapping[self.getIdx(nums[i - k], size)]
        return False

    def getIdx(self, u, size):
        return u // size if u >= 0 else ((u + 1) // size) - 1;
  • 时间复杂度:
  • 空间复杂度:

【重点】如何理解 getIdx() 的逻辑

  1. 为什么 size 需要对 t 进行 +1 操作?

目的是为了确保差值小于等于 t 的数能够落到一个桶中。

举个 🌰,假设 [0,1,2,3]t = 3,显然四个数都应该落在同一个桶。

如果不对 t 进行 +1 操作的话,那么 [0,1,2][3] 会被落到不同的桶中,那么为了解决这种错误,我们需要对 t 进行 +1 作为 size

这样我们的数轴就能被分割成:

0 1 2 3 | 4 5 6 7 | 8 9 10 11 | 12 13 14 15 | …

总结一下,令 size = t + 1 的本质是因为差值为 t 两个数在数轴上相隔距离为 t + 1,它们需要被落到同一个桶中。

当明确了 size 的大小之后,对于正数部分我们则有 idx = nums[i] / size

  1. 如何理解负数部分的逻辑?

由于我们处理正数的时候,处理了数值 0,因此我们负数部分是从 -1 开始的。

还是我们上述 🌰,此时我们有 t = 3size = t + 1 = 4

考虑 [-4,-3,-2,-1] 的情况,它们应该落在一个桶中。

如果直接复用 idx = nums[i] / size 的话,[-4][-3,-2,-1] 会被分到不同的桶中。

根本原因是我们处理整数的时候,已经分掉了数值 0

这时候我们需要先对 nums[i] 进行 +1 操作(即将负数部分在数轴上进行整体右移),即得到 (nums[i] + 1) / size

这样一来负数部分与正数部分一样,可以被正常分割了。

但由于 0 号桶已经被使用了,我们还需要在此基础上进行 -1,相当于将负数部分的桶下标(idx)往左移,即得到 ((nums[i] + 1) / size) - 1

最后

巨划算的 LeetCode 会员优惠通道目前仍可用 ~

使用福利优惠通道 leetcode.cn/premium/?promoChannel=acoier,年度会员 有效期额外增加两个月,季度会员 有效期额外增加两周,更有超大额专属 🧧 和实物 🎁 福利每月发放。

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

欢迎关注,明天见。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多文件多子目录makefile

这里写目录标题 1 makefile原理2 MakeFile步骤3 多文件多子目录Makefile实例4 总结附录一&#xff1a;常用Bash指令附录二&#xff1a;常用批处理变量附录三&#xff1a;常用makefile指令 1 makefile原理 编译过程是将高级语言&#xff08;如C、C等&#xff09;源代码转换为可…

如何利用数字化智慧法务管理平台,提升企业合规与治理水平?

在当今这个日新月异的时代&#xff0c;企业管理正面临着前所未有的挑战与机遇。随着数字化浪潮的汹涌澎湃&#xff0c;企业治理水平的提升已不再是简单的管理升级&#xff0c;而是需要借助科技的力量&#xff0c;实现智慧化、精细化的管理。而智慧法务管理平台&#xff0c;正是…

电子电路产业园废水处理与资源回收的创新实践

随着电子产品的普及和技术革新步伐的加快&#xff0c;电子电路制造业已成为推动现代科技发展的关键力量之一。然而&#xff0c;随之而来的环保问题不容忽视。电镀工艺作为电子电路生产中的一个核心环节&#xff0c;其产生的含镍废水处理成为了企业必须面对的重要课题。本文将探…

【组件】前端js HEIC/HEIF 转换为JPEG、PNG或GIF格式 苹果格式

【组件】前端js HEIC/HEIF 转换为JPEG、PNG或GIF格式 Heic2any: Client-side conversion of HEIC/HEIF image files to JPEG,PNG, or GIF in the browser.https://alexcorvi.github.io/heic2any/#demo GitHub - alexcorvi/heic2any: Converting HEIF/HEIF image formats to PN…

redis 中缓存 百万级别表的查询数据 出错:Query execution was interrupted

项目背景&#xff1a;项目需要 首检合格率 这个结果&#xff0c;但是sql执行非常慢&#xff0c;就想着使用redis来优化接口的速度。现在我需要将数据库查询结果存储到redis&#xff0c;但是就是这一小步&#xff0c;也非常困难。我是用定时任务来实现上面的目的。 Component S…

基于android studio开发的仿QQ聊天软件源代码+数据库+实验报告

安卓客户端基于java 编程语言 在android studio 环境中开发。 内部图片资源很大一部分是反编译手机QQapp 获得的。 服务器端技术路线 聊天系统服务器基于Java Socket网络编程和并发编程、多线程技术、jdbc实现。 通过哈希表&#xff08;hashmap&#xff09;存储来自每一个向客…

读书笔记:《程序员修炼之道——从小工到专家》

前言 此书有两个版本&#xff0c;我读的是第一版&#xff0c;大学时买了略略翻过&#xff0c;当时太懵懂无法理解书中提出的观点&#xff0c;看了也记不得&#xff0c;感觉比较适用于有过1~2个项目工作经验的同学&#xff0c;初学者不一定能看得懂&#xff0c;工作之后看&…

学习通、智慧职教刷课脚本

&#x1f410;个人主页 可惜已不在 &#x1f40b;可以分享给身边有需要的人&#x1f436; &#x1f409;有用的话就留下一个三连吧&#x1f63c; 目录 一.安装 脚本运行器 篡改猴 - Microsoft Edge Addons 二.安装脚本 三.扩展 一.安装 脚本运行器 安装浏览器 Microsoft E…

【多因子分组箱线图】:附Origin详细画图教程

目录 No.1 理解箱线图 1 什么是箱线图 2 箱线图的组成 No.2 画图流程 1 导入数据并绘图 2 设置绘图细节 3 设置坐标轴 4 效果图 No.1 理解箱线图 1 什么是箱线图 箱线图&#xff0c;又称箱形图、盒须图或盒式图&#xff0c;用于体现数据分散情况的统计图。在视觉上辅助…

初始爬虫5

响应码&#xff1a; 数据处理&#xff1a; re模块&#xff08;正则表达式&#xff09; re模块是Python中用于正则表达式操作的标准库。它提供了一些功能强大的方法来执行模式匹配和文本处理。以下是re模块的一些常见用法及其详细说明&#xff1a; 1. 基本用法 1.1 匹配模式 …

CDGA|如何实施非常精准的数据治理策略?

在信息化高速发展的今天&#xff0c;数据已成为企业最重要的生产要素之一&#xff0c;其价值日益凸显。然而&#xff0c;随着数据量的爆炸性增长&#xff0c;如何精准地管理和控制数据成为企业亟待解决的问题。本文将从设定目标、制定策略、组织结构建设、制度流程规范以及技术…

新发现!一键管理所有远程会话的神器——1Remote

大家好&#xff0c;今天给大家介绍一款非常实用的工具——1Remote&#xff0c;这是一款现代化的个人远程会话管理器与启动器&#xff0c;让您的远程工作变得更加轻松高效&#xff01; 项目介绍 &#x1f680; 核心功能概览 多协议支持&#xff1a;1Remote支持RDP、SSH、VNC、…

OBD服务0X0A--请求排放相关的永久DTC

服务0x0A的主要目的是允许外部测试设备获取所有具有“永久DTC状态”的故障诊断码&#xff08;DTC&#xff09;。这些DTCs是“已确认”的&#xff0c;并且被保留在服务器的非易失性存储器&#xff08;NVRAM&#xff09;中&#xff0c;直到针对每个DTC的相应监控器确定故障不再存…

如何使用ORJSONResponse增强FastAPI应用性能:转换任意类型为JSON

在FastAPI中&#xff0c;ORJSONResponse 是一种自定义响应类型&#xff0c;它使用 orjson 库来提高 JSON 数据的序列化性能。orjson 是一个快速且正确的 Python JSON 库&#xff0c;它支持 dataclass、datetime 和 numpy 等数据类型的序列化。使用 ORJSONResponse 可以提升 API…

打造民国风格炫酷个人网页:用HTML和CSS3传递民国风韵

附源码&#xff01;&#xff01;&#xff01; 感谢支持 小弟不断创作网站demo感兴趣的可以关注支持一下 对了 俺在结尾带上了自己用的 背景 大家可以尝试换一下效果更好哦~~~ 如何创建一个民国风格的炫酷网页 在这篇博客中&#xff0c;我们将展示如何制作一个结合民国风格和…

【Java文件操作】文件系统操作文件内容操作

文件系统操作 常见API 在Java中&#xff0c;File类是用于文件和目录路径名的抽象表示。以下是一些常见的方法&#xff1a; 构造方法&#xff1a; File(String pathname)&#xff1a;根据给定的路径创建一个File对象。File(String parent, String child)&#xff1a;根据父路径…

CANFD接口卡配套奇瑞上位机检测电池状态

随着汽车电子的高速发展&#xff0c;车内信息的急剧增多&#xff0c;传统的CAN总线的数据传输能力已经很难满足车辆ECU的数据传输需求了&#xff0c;此时CANFD就应运而生了。 CANFD和CAN最主要的区别就是CANFD的ID段和数据段能够以不同的速率传输数据&#xff0c;这就保证了即…

下一代 AI 医疗:知识图谱RAG + 多智能体,听医生的话没前途,让医生听你的话才是正道!

下一代 AI 医疗&#xff1a;知识图谱RAG 多智能体&#xff0c;听医生的话没前途&#xff0c;让医生听你的话才是正道&#xff01; 医疗算法趋势现代 AI 医疗算法问题医学影像算法的局限医疗知识图谱的问题基于最本质循证医学实现人类级因果推理摆脱LLM概率性输出 嘘&#xff0…

用python操作Excel表格(自动化办公)!

文章开始前打个小广告——分享一份Python学习大礼包&#xff08;激活码安装包、Python web开发&#xff0c;Python爬虫&#xff0c;Python数据分析&#xff0c;人工智能、自动化办公等学习教程&#xff09;点击领取&#xff0c;100%免费&#xff01; 一、openpyxl介绍安装 1.…

影刀RPA:考勤自动打卡小程序

上班族&#xff0c;最惊心动魄的一件事&#xff0c;是什么&#xff0c;当然是&#xff1a;打卡 即使你在智能手机上设置提醒&#xff0c;比如闹钟或者日历事件&#xff0c;提醒自己按时打卡&#xff0c;但依然会忘记 即使公司很开明&#xff0c;使用的考勤系统支持可以设置自…