大家好,我是苍何。
之前发了神仙公司名单(深圳篇、重庆篇、成都篇、北京篇、武汉篇、长沙篇、广州篇、杭州篇),感受到了大家浓浓的热情,也一度让我明白了一句至理名言:越是稀有,越是弥足珍贵。
趁着周末,继续肝这个系列。上一篇神仙公司名单(杭州)留言区呼声最高的是西安。
之前的每一篇中都有读者留言安排西安,讲真,不是苍何不想早点安排,实在是比较难找,外包之都可不是吹的。
今天我决定迎难而上,吐血做了整理,我们就来看一看西安都有哪些神仙公司吧。
神仙公司民间说法是指的那些不加班,工资高,福利好的公司,于个人可能就是钱多、事少、离家近。神仙公司在民间我们通常指能做到 WLB(工作生活平衡,不加班) 的公司。
老规矩,放名单前,先来看看西安这座城市。
稍微懂点历史的都知道,西安,是十三朝古都,这里见证了无数王朝的兴衰,留下了丰富的历史遗迹。
西安兵马俑,被誉为「世界第八大奇迹」,虽然没有亲自去一趟,但看着网上的视频,每个兵马俑的面部表情都各不相同,古人的精湛技艺真是强的可怕。
除了历史遗迹,作为吃货,肉夹馍、羊肉泡馍、凉皮在小吃街真是随处可见,就是不知道西安回民街的肉夹馍和我在外地吃的肉夹馍有何不同。
西安的互联网环境在当下并不算很好,他是中国外包之都,每年西安高校毕业生想留在西安,但不是谁都能去的华为那样的大厂,很多人被迫去了一线,因为很多人并不想干外包。
好啦,下面我们进入神仙公司名单。
文字再来一遍:
1、中国图书进出口西安有限公司
六险二金、午餐补贴、一般情况 5 点下班,天气不好或节假日前一天可提前至 4 点下班。90 后偏多,稳定不内卷,薪资不高比较适合追求稳定的朋友。
2、西门子
弹性工作,加班少,能够平衡工作和家庭。五险一金,额外有企业年金和补充医疗,年假 15 天。有食堂,班车。对女性友好,有母婴室,育儿假,提供儿童保育设施或资源,支持家庭相关福利政策等,工会俱乐部活动很多,公司每年会组织一次旅行。
3、陕投集团
神仙国企,六险二金、带薪年休假、伙食餐补、通讯补贴、生日福利和健康体检等,每年有季度奖和年终奖,综合可达 15 薪,双休不卷,可以准点下班。
4、维塔士
游戏界的清流,双休不卷,五险一金、年终奖金、带薪年假、餐费补贴、弹性工作时间、年度旅游、子女福利等福利,不鼓励加班,工作强度较低,非常注重员工工作和生活的平衡。
5、Thoughworks
上下班不打卡,没有上下级关系,那女比例接近1:1,技术氛围浓厚,加班不多,社保公积金,福利待遇该有的一样不少,早9:30晚18:00,平均月薪在 12 k~45 k(需要特别注意,必须是正编才是此类待遇,外包不是)。
6、三星电子研究所
提供六险一金、商业保险(含子女)、餐费补贴、项目奖金、长期贡献奖、此外,公司还提供法定假期、公司福利年假、带薪奖励休假、年度体检、心理健康咨询、节日福利、弹性工时、班车接送、员工健身房等,最关键的是三星系列产品有专属折扣,而且有出国机会,在招岗位 15 k~39 k,13 薪;
7、创客云商
上午09:00 - 下午06:00,双休,五险一金,带薪年假,员工旅游,免费班车,免费化妆品,节日福利,团队聚餐等应有尽有,招聘明确表示不加班。
8、天和防务
高科技军工企业,年假、项目奖、工作餐、班车服务、免费体检、年终绩效奖金和过节礼品等,双休,工作时间为上午8:30至12:00,下午13:00至17:30,下班准时,上班轻松。
9、葡萄城
六险一金、餐饮补贴、员工旅游、定期体检,双休,弹性工作,工作人性化,能做到 WLB,在招岗位 10 k~20 k,13 薪;
好啦,以上就是坐标「西安」的神仙公司名单,,你有什么补充的呢?欢迎评论区讨论。
...
回归主题。
今天来一道西安某公司考过的一道面试算法题,给枯燥的牛马生活加加油😂。
题目描述
平台:LeetCode
题号:373
题目名称:查找和最小的 K 对数字
给定两个升序排列的整数数组 nums1
和 nums2
,以及一个整数 k
。定义一对数值 (u, v)
,其中第一个元素来自 nums1
,第二个元素来自 nums2
。
请找到和最小的 k
对数值 (u1, v1), (u2, v2), ..., (uk, vk)
。
示例
示例 1:
输入:nums1 = [1,7,11]
,nums2 = [2,4,6]
,k = 3
输出:[[1,2],[1,4],[1,6]]
解释:
返回和最小的前 3 对数值:[1,2], [1,4], [1,6]
[7,2], [7,4], [7,6], [11,2], [11,4], [11,6]
。
示例 2:
输入:nums1 = [1,1,2]
,nums2 = [1,2,3]
,k = 2
输出:[[1,1],[1,1]]
解释:
返回和最小的前 2 对数值:[1,1], [1,1], [1,2], [1,2], [2,1], [2,2], [2,3]
。
提示:
1 <= nums1.length, nums2.length <= 10^5
-10^9 <= nums1[i], nums2[i] <= 10^9
nums1
和nums2
均为 升序排列1 <= k <= 10^4
k <= nums1.length * nums2.length
解题思路
思路概述
我们需要在两个升序数组中找到和最小的前 k 对数值。直接生成所有可能的对并排序在时间复杂度上不可接受,因此可以利用最小堆来优化查找过程。具体步骤如下:
最小堆初始化:
每对
(nums1[i], nums2[0])
的和是数组中最小的,可以优先将它们放入最小堆。将
nums1
的前min(k, len(nums1))
个元素与nums2[0]
组成的对(nums1[i], nums2[0])
放入堆中。
维护最小堆:
每次从堆中取出最小和的对
(u, v)
,并将结果加入答案。然后将与当前对相关的新对
(u, nums2[j+1])
(如果存在)加入堆,继续调整堆。
结束条件:
当取出的对数达到
k
或堆为空时结束。
时间复杂度分析
最小堆的维护代价是 (O (\log k))。
每次加入堆的对数不会超过 (k),总的时间复杂度为 (O (k \log k))。
代码实现
Java 实现
import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;
public class KSmallestPairs {
public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {
List<List<Integer>> result = new ArrayList<>();
if (nums1 == null || nums2 == null || nums1.length == 0 || nums2.length == 0 || k <= 0) {
return result;
}
// 最小堆,按每对的和排序
PriorityQueue<int[]> minHeap = new PriorityQueue<>((a, b) -> nums1[a[0]] + nums2[a[1]] - nums1[b[0]] - nums2[b[1]]);
// 初始化堆,将 nums1 的前 k 个元素与 nums2[0] 组合加入堆中
for (int i = 0; i < Math.min(k, nums1.length); i++) {
minHeap.offer(new int[] { i, 0 }); // 存储索引对
}
// 取出最小的 k 对
while (!minHeap.isEmpty() && result.size() < k) {
int[] cur = minHeap.poll();
int i = cur[0], j = cur[1];
List<Integer> pair = new ArrayList<>();
pair.add(nums1[i]);
pair.add(nums2[j]);
result.add(pair);
// 如果 nums2[j+1] 存在,将新对 (nums1[i], nums2[j+1]) 加入堆
if (j + 1 < nums2.length) {
minHeap.offer(new int[] { i, j + 1 });
}
}
return result;
}
}
C++实现
#include <vector>
#include <queue>
using namespace std;
class Solution {
public:
vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {
vector<vector<int>> result;
if (nums1.empty() || nums2.empty() || k <= 0) return result;
// 最小堆,按每对的和排序
auto compare = [&](pair<int, int>& a, pair<int, int>& b) {
return nums1[a.first] + nums2[a.second] > nums1[b.first] + nums2[b.second];
};
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(compare)> minHeap(compare);
// 初始化堆,将 nums1 的前 k 个元素与 nums2[0] 组合加入堆中
for (int i = 0; i < min(k, (int)nums1.size()); i++) {
minHeap.emplace(i, 0);
}
// 取出最小的 k 对
while (!minHeap.empty() && result.size() < k) {
auto cur = minHeap.top();
minHeap.pop();
int i = cur.first, j = cur.second;
result.push_back({nums1[i], nums2[j]});
// 如果 nums2[j+1] 存在,将新对 (nums1[i], nums2[j+1]) 加入堆
if (j + 1 < nums2.size()) {
minHeap.emplace(i, j + 1);
}
}
return result;
}
};
Python 实现
import heapq
def kSmallestPairs(nums1, nums2, k):
if not nums1 or not nums2 or k <= 0:
return []
# 最小堆
min_heap = []
# 初始化堆,将 nums1 的前 k 个元素与 nums2[0] 组合加入堆中
for i in range(min(k, len(nums1))):
heapq.heappush(min_heap, (nums1[i] + nums2[0], i, 0)) # 存储 (和, nums1索引, nums2索引)
result = []
# 取出最小的 k 对
while min_heap and len(result) < k:
_, i, j = heapq.heappop(min_heap)
result.append([nums1[i], nums2[j]])
# 如果 nums2[j+1] 存在,将新对 (nums1[i], nums2[j+1]) 加入堆
if j + 1 < len(nums2):
heapq.heappush(min_heap, (nums1[i] + nums2[j + 1], i, j + 1))
return result
复杂度分析
时间复杂度:(O (k \log k)),堆操作的复杂度。
空间复杂度:(O (k)),堆的大小。
ending
你好呀,我是苍何。是一个每天都在给自家仙人掌讲哲学的执着青年,我活在世上,无非想要明白些道理,遇见些有趣的事。倘能如我所愿,我的一生就算成功。共勉 💪
点击关注下方账号,你将感受到一个朋克的灵魂,且每篇文章都有惊喜。
感谢大家一直以来的阅读、在看和转发,我会把流量主收益都用来发红包,大家可在公众号页面发送相关暗号关键词获取抽奖,每一篇文章会给到一个不同的暗号,对应的抽奖都是独立的,此篇暗号为【西安】,在后台回复【西安】,即可点击进去参与抽奖!抽奖内容、金额、个数等都无变化,在开奖前参与抽奖,操作均有效。
注意,后台(不是评论区,是后台)回复【西安】即可参与抽奖。
后台回复(不是评论区,是后台)即可参与抽奖。
后台回复(不是评论区,是后台)即可参与抽奖。
就像大家之前回复【八股】一样。