大家好,我是苍何。
最近国家统计局编著出版的《中国统计年鉴2024》公布了 2023 年 31 个省份就业人员的工资统计数据。觉得很有必要给大家做个分享。
稍微做了下计算,2023 年全国城镇非私营单位就业人员年平均工资为 120698元。
换成月薪的话,那不就是月薪都过万了啊?
但细想一下,这数据并不能作为一个衡量标准,首先平均数水分最大,毕竟我和马云薪资一平均,说不定也是个百万富翁😂,要看就得看中位数。
其次,可以看到城镇私营单位就业人员年平均工资为 68340 元。平均月薪只有 5695 元。有人说,就这?还不够我交公积金的呢。好扒,你牛🐶。
从城市来看,上海、北京稳稳占据第一梯队。这两城市城镇非私营单位年平均工资居然超过了 20 万!简直遥遥领先。
从行业看,我国收入最高的三个行业分别是信息传输、软件和信息技术服务业,金融业,科学研究和技术服务业。
而北京、上海是这些高收入行业最集中的地方,故而收入偏高很多。
我之前的文章中有不少是互联网大厂各种薪资爆料,看久了,你会觉得,为何月薪过万,对于互联网刚毕业的学生来说,都瞧不上,白菜价中的白菜价。而对于在一些传统行业,月薪过万可能是一辈子的梦想。
真实的情况到底是怎样的?到底多少人月薪过万?
从城镇私营单位平均工资来看,如果你月薪过万,已经完全超过了全国所有地区的平均数。
我又找了一组数据,在CNNIC发布的第47次《中国互联网络发展状况统计报告》里,其中月收入在 8000 以上的仅有 14.8 %。
别的不说,外卖员、快递小哥,滴滴师傅,又有多少人能达到月薪一万的标准呢?
那些风里来雨里去的最辛勤的劳动者,光是勉强维持生计就已经费尽全力了。
那究竟哪些人,哪些行业都月入过万呢?
看了下数据,IT、互联网、游戏是分布最多的行业,而我所处的 IT 行业,月薪过万确实比较普遍。
再看一组数据,月薪一万,都是些什么学历呢?
可以看到在月入一万职场人的学历分布中,本科占比 59.64%,大专及以下学历的职场人有23.75%,而硕士和博士很多都高于这个标准。
所以从现象来看,读书不见得没用,当然选择也更为重要,有些人选了个好专业,热门赛道,分分钟月入过万。
专业选择可能现在可控不多了,但刚毕业,选择城市也显得尤为重要,我一般都是建议能去一线就去一线,能去大厂就去大厂,先把自己工资基数拉高,以后即使想回老家发展了,也有的折扣可打,不然打骨折后,渣都不剩。
毕竟,在一线城市你能收获的眼界,资源,机遇,这些不是二三线城市能比的,在这种环境中,你自然成长会更快,当然你也赚的更多。
哎,又是打工人被平均的一年,今天你被平均了吗?欢迎评论区讨论。
...
回归主题。
今天来一道中位数相关的面试算法题,给枯燥的牛马生活加加油😂。
题目描述
平台:LeetCode
题号:295
题目名称:数据流的中位数
题目描述:
中位数是有序整数列表的中间值。如果列表的大小是偶数,则中位数是中间两个数的平均值。
例如,
arr = [2,3,4]
的中位数是3
。例如,
arr = [2,3]
的中位数是(2 + 3) / 2 = 2.5
。
实现 MedianFinder
类:
MedianFinder()
初始化MedianFinder
对象。void addNum(int num)
将数据流中的整数num
添加到数据结构中。double findMedian()
返回到目前为止所有元素的中位数。与实际答案相差10^-5
以内的答案将被接受。
示例:
输入:
["MedianFinder", "addNum", "addNum", "findMedian", "addNum", "findMedian"]
[[], [1], [2], [], [3], []]
输出:
[null, null, null, 1.5, null, 2.0]
解释:
MedianFinder medianFinder = new MedianFinder();
medianFinder.addNum(1); // arr = [1]
medianFinder.addNum(2); // arr = [1, 2]
medianFinder.findMedian(); // 返回 1.5 ((1 + 2) / 2)
medianFinder.addNum(3); // arr = [1, 2, 3]
medianFinder.findMedian(); // 返回 2.0
提示:
-10^5 <= num <= 10^5
在调用
findMedian
之前,数据结构中至少有一个元素。最多调用
5 * 10^4
次addNum
和findMedian
。
解题思路
本题需要设计一个高效的数据结构以支持动态计算中位数。
核心思路:
使用两个堆:
一个最大堆存储较小的一半元素(
left
),堆顶为最大值。一个最小堆存储较大的一半元素(
right
),堆顶为最小值。
保证平衡:
两个堆的元素数量相等,或者最大堆比最小堆多一个元素。
插入时根据大小关系插入到对应堆中,并在需要时平衡两个堆。
中位数计算:
当元素个数为奇数时,中位数为最大堆堆顶。
当元素个数为偶数时,中位数为两个堆堆顶的平均值。
算法流程:
调用
addNum(num)
:
如果新元素小于等于最大堆的堆顶,加入最大堆;
否则加入最小堆;
平衡两个堆的大小。
调用 findMedian()
:
若总元素数为奇数,返回最大堆堆顶;
若总元素数为偶数,返回两个堆顶的平均值。
时间复杂度:
插入操作:
O(log n)
(堆的插入与调整)。获取中位数:
O(1)
。
代码实现
Java 实现
import java.util.PriorityQueue;
class MedianFinder {
private PriorityQueue<Integer> left; // 最大堆
private PriorityQueue<Integer> right; // 最小堆
public MedianFinder() {
left = new PriorityQueue<>((a, b) -> b - a); // 最大堆
right = new PriorityQueue<>(); // 最小堆
}
public void addNum(int num) {
if (left.isEmpty() || num <= left.peek()) {
left.offer(num);
} else {
right.offer(num);
}
// 平衡两个堆的大小
if (left.size() > right.size() + 1) {
right.offer(left.poll());
} else if (right.size() > left.size()) {
left.offer(right.poll());
}
}
public double findMedian() {
if (left.size() > right.size()) {
return left.peek();
} else {
return (left.peek() + right.peek()) / 2.0;
}
}
}
C++ 实现
#include <queue>
using namespace std;
class MedianFinder {
private:
priority_queue<int> left; // 最大堆
priority_queue<int, vector<int>, greater<int>> right; // 最小堆
public:
MedianFinder() {}
void addNum(int num) {
if (left.empty() || num <= left.top()) {
left.push(num);
} else {
right.push(num);
}
// 平衡两个堆的大小
if (left.size() > right.size() + 1) {
right.push(left.top());
left.pop();
} else if (right.size() > left.size()) {
left.push(right.top());
right.pop();
}
}
double findMedian() {
if (left.size() > right.size()) {
return left.top();
} else {
return (left.top() + right.top()) / 2.0;
}
}
};
Python 实现
import heapq
class MedianFinder:
def __init__(self):
self.left = [] # 最大堆(用负数模拟)
self.right = [] # 最小堆
def addNum(self, num: int) -> None:
# 插入到最大堆或最小堆
if not self.left or num <= -self.left[0]:
heapq.heappush(self.left, -num)
else:
heapq.heappush(self.right, num)
# 平衡两个堆的大小
if len(self.left) > len(self.right) + 1:
heapq.heappush(self.right, -heapq.heappop(self.left))
elif len(self.right) > len(self.left):
heapq.heappush(self.left, -heapq.heappop(self.right))
def findMedian(self) -> float:
if len(self.left) > len(self.right):
return -self.left[0]
else:
return (-self.left[0] + self.right[0]) / 2.0
测试代码
# 示例测试
medianFinder = MedianFinder()
medianFinder.addNum(1) # arr = [1]
medianFinder.addNum(2) # arr = [1, 2]
print(medianFinder.findMedian()) # 输出 1.5
medianFinder.addNum(3) # arr = [1, 2, 3]
print(medianFinder.findMedian()) # 输出 2.0
ending
你好呀,我是苍何。是一个每天都在给自家仙人掌讲哲学的执着青年,我活在世上,无非想要明白些道理,遇见些有趣的事。倘能如我所愿,我的一生就算成功。共勉 💪
点击关注下方账号,你将感受到一个朋克的灵魂,且每篇文章都有惊喜。
感谢大家一直以来的阅读、在看和转发,我会把流量主收益都用来发红包,大家可在公众号页面发送相关暗号关键词获取抽奖,每一篇文章会给到一个不同的暗号,对应的抽奖都是独立的,此篇暗号为【平均】,在后台回复【平均】,即可点击进去参与抽奖!抽奖内容、金额、个数等都无变化,在开奖前参与抽奖,操作均有效。
注意,后台(不是评论区,是后台)回复【平均】即可参与抽奖。
后台回复(不是评论区,是后台)即可参与抽奖。
后台回复(不是评论区,是后台)即可参与抽奖。
就像大家之前回复【八股】一样。