刚看到个贴子,说一哥们去年在大厂年薪快百万,去见女友父母爱答不理;今年考上国家电网,人都还没去,叔叔阿姨先把彩虹屁拍满了,吃饭都不让他动筷子。典型的“编制一到,地位起飞”。

这事,倒也不完全是爸妈势利,更多是代际观念不同。上一代经历过下岗、裁员,在他们眼里,编制=一辈子有饭吃,至于年薪多少、期权期望,那都是虚的。
说到底,婚姻是两家人的价值观匹配:有人要稳定,有人要成长,都不算错。关键看女朋友站哪边,她才是跟你过日子的人。
踏实提升自己,让选择权尽量在自己手里,比啥都强。至于别人怎么评价,就当饭桌上的背景音吧。
我先说个生活里的事啊。
前两天我们组搞团建,去公司楼下操场跑步比赛,完事儿大家在那儿吵吵: “我是第二吧?” “你肯定排我后面,我比你先冲线的!”
我在旁边看着就乐,这不就是一道典型的算法题嘛:一堆人的成绩,怎么给每个人标上名次,还得能区分出“金银铜牌”。
算法题名字就叫:相对名次(Relative Ranks)。
给你一个 int[] score,里面是每个选手的得分,分数越大名次越靠前。 要求返回一个 String[],下标跟原数组对应:
"Gold Medal""Silver Medal""Bronze Medal""4", "5" 这样注意一点:返回结果的顺序,是“原来的顺序”,不是排完序的顺序。
你可以先想象一下操场场景:
用程序做就是三步:
(分数, 原下标)这样既能确定名次,又不会丢掉原来是谁是谁。
直接上代码,你们可以拷到本地跑一下:
import java.util.Arrays;publicclassRelativeRanks{public String[] findRelativeRanks(int[] score) {int n = score.length;// pairs[i][0] = 分数, pairs[i][1] = 原来的下标int[][] pairs = newint[n][2];for (int i = 0; i < n; i++) { pairs[i][0] = score[i]; pairs[i][1] = i; }// 按分数从大到小排序 Arrays.sort(pairs, (a, b) -> b[0] - a[0]); String[] ans = new String[n];for (int rank = 0; rank < n; rank++) {int idx = pairs[rank][1]; // 原来的下标if (rank == 0) { ans[idx] = "Gold Medal"; } elseif (rank == 1) { ans[idx] = "Silver Medal"; } elseif (rank == 2) { ans[idx] = "Bronze Medal"; } else { ans[idx] = String.valueOf(rank + 1); } }return ans; }// 简单测一下publicstaticvoidmain(String[] args){ RelativeRanks rr = new RelativeRanks();int[] score = {10, 3, 8, 9, 4}; String[] res = rr.findRelativeRanks(score);for (String s : res) { System.out.println(s); }// 输出应该是:// Gold Medal// 5// Bronze Medal// Silver Medal// 4 }}你可以注意两个点:
Arrays.sort,带一个自定义比较器 (a, b) -> b[0] - a[0],表示按分数从高到低排pairs[rank][1] 这个“原下标”,保证结果数组跟最初传进来的顺序是一一对应的简单算一下复杂度哈:
pairs 数组:遍历一遍,O(n)O(n log n)O(n)整体就是 O(n log n),对于面试题、OJ题都足够用了,逻辑上也比较直观,不是那种“看不懂但好像很快”的写法。
内存方面,我们额外开了一个 int[n][2] 和一个 String[n],空间复杂度 O(n),也没啥问题。
有些同学一上来就写成这样:
Arrays.sort(score); // 把原数组直接排了这样会有两个坑:
所以一定要记住:排序用的是“分数 + 原下标”的副本,原数组不要动它。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html