刚毕业家里人就找我要钱...
刚看到个贴子,说刚毕业家里人就开始张口要钱,甚至还要管工资。说实话,这种场面我也见多了,身边不少同行都吐槽过。家长总觉得,孩子挣钱了,理所应当上交
我觉得这事吧,说到底还是代际观念的差异。程序员入行辛苦,天天加班写bug,好不容易攒点钱,真不是天上掉的。网友们有的说父母养大不容易,给点也正常;但也有很多人觉得自己赚钱了更想自主,别啥都被“管控”了。
怎么说呢,我还是觉得经济独立很重要。不是不孝顺,而是成年人了,理财能力、责任心,得靠自己练。家里要是有困难,当然该出手,但要我全部工资都交上去,我真做不到。
总的来说还是要沟通,家里也别太理所应当,毕竟我们也要养活自己、提升自己,不是提款机。【备注:文末可领最新资料】
算法题:应该被禁止的 Leetflex 账户
有个群友在群里问我:Leetflex 那道“应该被禁止的账户”到底咋搞啊?说实话我脑袋还有点晕,正好就想歇会聊两句。
其实那题大致就是,有个list,里面全是账户操作记录,每一条都是“用户A 给 用户B 转了多少钱”,然后要你判断哪些账户应该被封号,因为有些账户是被滥用来薅羊毛或者洗钱的。关键点其实不是光看交易次数,而是有个比较严格的判断条件: 如果某个账户在24小时内收到了超过N个人的转账,这种就很可疑。你想象一下,现实生活中,一个人突然一天收到二十几个人转钱给他,银行不查你查谁对吧?当然还有一些更变态的条件,反正就是变着法子让你筛那些“疑似异常活跃”的账户。
那种写法最容易踩的坑其实就是,你别一上来用HashMap乱暴力统计,或者用两层for,数据量大起来直接卡死。我当时一边啃面包一边给那兄弟发语音,我说你先别急着开写,脑子里先画个草图,典型滑动窗口。其实就是类似微信那种聊天消息的既视感,你得维护一个时间窗口,每次来一条新数据就往窗口里塞,如果超时就把老的剔出去,这样保证你窗口里永远都是24小时内的记录。
简单举个例子,比如账户a在2024-07-01 10:00收到了b的转账,10:01又收了c的转账,以此类推。那你窗口里存的其实就是一堆(timestamp, 来源用户),每新来一个,先把窗口里时间早于当前-24小时的全踢了,然后看窗口里独立来源用户数是不是超过阈值,超过就直接加黑名单。
代码其实也不复杂,我那会手上没IDEA,就用记事本敲了一下,大致像这样:
public List<String> findSuspiciousAccounts(List<Transaction> records, int threshold){
Map<String, LinkedList<Transaction>> window = new HashMap<>();
Set<String> banned = new HashSet<>();
for (Transaction tx : records) {
String to = tx.to;
if (!window.containsKey(to)) window.put(to, new LinkedList<>());
LinkedList<Transaction> list = window.get(to);
list.add(tx);
// 滑动窗口,踢掉超时的
while (!list.isEmpty() && tx.time - list.getFirst().time > 86400) {
list.removeFirst();
}
// 统计来源用户的去重数
Set<String> fromUsers = new HashSet<>();
for (Transaction t : list) {
fromUsers.add(t.from);
}
if (fromUsers.size() >= threshold) {
banned.add(to);
}
}
returnnew ArrayList<>(banned);
}
你们别太较真,这里时间是秒级,实际线上肯定用long类型的timestamp。 有时候面试官还会问你,如果一天数据上千万怎么办?我当时回他一句,兄弟你用LinkedList就别怕慢,你窗口大但每次最多删头部,数据结构O(1),不会炸。大不了用TreeMap做下优化,看你业务需求。
再补一句,这种题一定要注意“同一个用户多次给同一个人转账”到底算一次还是多次,有的题目卡这种细节。另外,如果数据是无序的,记得提前按时间排序,不然窗口就挂了。那会群里还有人直接上stream API,代码又短又炫,其实核心还是滑窗思想。
-END-
我为大家打造了一份RPA教程,完全免费:https://www.songshuhezi.com/rpa.html