程序员老鬼

同事偷偷给我介绍私活,说1万报酬全给我,结果甲方私下告诉我说,同事在当中白拿了2万,我觉得被耍了,媳妇却让我要知足,说我一点不亏

刚看到个贴子,说同事给楼主介绍了个私活,明面上一万全给他,结果甲方说这单其实三万。同事中间白拿两万,楼主觉得被坑,媳妇却说“你不亏,还得感谢人家”。

Image

我觉得这事吧,从情理上楼主确实挺憋屈的,毕竟被人当枪使,换谁心里都不是滋味。但从利益角度看,媳妇也没错。你能顺利接到单、赚到这一万,确实靠人家牵线搭桥。现实就是这样——机会也有价,人家手里有资源,吃点“中介费”太正常。

不过我还是建议,别再让自己被动。一单两单无所谓,久了别人就习惯薅你羊毛。能合作就合作,不能信任的,就保持距离。职场这点事,说白了就是“利益平衡”。能赚就赚,别被情绪拖着走,知足但也得长记性。【备注:文末可领最新资料】

算法题:找出最大的可达成数字

昨天晚上十一点多,我在公司楼下吹风,手机叮一下,小李问我:哥,那个…“找出最大的可达成数字”咋写啊?我一口奶茶差点喷出来,这题你们知道吧,给 1~9 的成本数组和一个目标 target,要拼出成本和正好等于 target 的、数值上最大的那个数字。贪心直接叠 9?不行,成本坑你。我就边走边跟他说,思路别急,动态规划,稳。

先把场景说清楚哈:cost[i] 表示数位 (i+1) 的成本,总预算 target。要的是“字典序更大且位数越多越好”的那个数。对吧。等会儿我先接个电话……好了继续。关键在状态:dp[t] 存“正好花 t 的钱能拼出的最优字符串”。为啥是字符串?因为要比较“哪一个更大”,位数优先、再比字典序。初始化 dp[0] = "",其他是不可达。转移的时候我一般从 9 往 1 遍历,因为我们更偏爱大数位;然后 t 从小到大累加(完全背包,每个数位可用多次)。每次尝试把当前数字 d 接到后面,形成候选 cand,再用一个“更优比较器”挑更好的。

有人会问顺序到底是“前面加”还是“后面加”?我试过两种,配好比较器都行。我图省事就把新位拼到末尾,然后比较函数这样定:先比长度,长的好;长度相同再按字典序比较(大的好)。这样从 9→1 的外层顺序也能自然“把大数字尽量放前”。

代码我贴一下,你们直接跑就行,我加了个 main 做个小样例,哦对,题目一般要求不可达就返回 "0":

import java.util.*;

publicclassLargestReachableNumber{

// 返回成本和为 target 的最大数字(字符串表示);不可达返回 "0"
public String largestNumber(int[] cost, int target){
        String[] dp = new String[target + 1];
        Arrays.fill(dp, null);
        dp[0] = "";

// 从 9 往 1,偏向用大数位
for (int d = 9; d >= 1; d--) {
int c = cost[d - 1];
// 完全背包:t 正序
for (int t = c; t <= target; t++) {
if (dp[t - c] == null) continue;
                String cand = dp[t - c] + d; // 把当前数位接到末尾
if (dp[t] == null || better(cand, dp[t])) {
                    dp[t] = cand;
                }
            }
        }
return dp[target] == null ? "0" : dp[target];
    }

// 比较哪个字符串代表的数字更“优”
// 规则:位数多更好;位数相同按字典序大的更好
privatebooleanbetter(String a, String b){
if (a.length() != b.length()) return a.length() > b.length();
return a.compareTo(b) > 0;
    }

// 随手测一下
publicstaticvoidmain(String[] args){
        LargestReachableNumber solver = new LargestReachableNumber();
// 假设:数字1..9的成本
int[] cost = {4,3,2,5,6,7,2,5,5};
int target = 9;
// 这个样例期望 "7772" 之类?别纠结具体,用你自己的数据测
        System.out.println(solver.largestNumber(cost, target));
    }
}

小坑我也顺嘴念两句,就是那个…别把比较器写反了,不然你会得到“最小”的数,笑死;还有 dp 里用 null 表示不可达,字符串空串只给 dp[0]。如果你非要把新数位加到前面,也行,把候选改成 d + dp[t-c],比较器仍然“长度优先 + 字典序”,一样过。哦对,线上我一般会把 String 换成 StringBuilder+克隆控制,压一丢丢 GC,但面试别整花的,先对再说。行了我去热个饭,等会儿谁又问这题我就把这段话甩过去…

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

最后给大家分享一份不错的副业资料,点击下方公众号,回复关键字: 副业 领取,也可以链接我领取,微信:hls404