程序员老鬼

外包天天晚上王者在线,却说没精力加班,怎么办

刚看到个贴子,说外包同事天天晚上王者开黑到半夜,却总跟领导说没精力加班。作为程序员,我的第一反应就是:这不是体力问题,而是态度问题。

Image

网友们有人说“人家下班爱怎么玩就怎么玩”,也有人吐槽“不愿干活还找借口”。我觉得两边都有道理。下班后确实是私人时间,但如果工作质量一塌糊涂,还拿游戏当挡箭牌,那就是不专业。毕竟职场看的是产出,而不是你喊多累。

换个角度想,加班本来就不是长久之计,效率才是王道。真要拒绝加班,可以坦诚说“今天效率不高,明天补上”,而不是一边肝游戏一边喊没精力。说到底,写代码和打游戏一样,讲究策略和自律,瞎玩只会被队友嫌弃。

该干的活干好,该玩的玩痛快,别拿娱乐当借口,保持职业态度才是真正的实力。【备注:文末可领最新资料】

算法题:数组中的逆序对

昨天晚上十一点多,我在公司楼下吹风,手机还在响,小李发来一句:“哥,逆序对咋数啊?脑壳疼。”我一口奶茶差点喷出来。别急,其实就是问:在一个数组里,有多少对下标 $ia[j]$。比如 [3,1,2] 里,(3,1) 和 (3,2) 就是两对。

最土的方法嘛,就是两层 for,把每一对都看看。对吧,暴力但好想:时间 。数组一长,你就能听见风扇起飞。昨晚我在楼下数了几分钟,心想算了…这玩意儿得用“分而治之”省事儿。

分而治之这套:边合并边数

思路像切披萨:把数组对半切开,两边各自的逆序对,递归一算;关键在“合并”的时候把跨边的对数顺手算了。怎么数?左右两边都排好序时,如果右边有个数比左边当前指针小,那说明左边当前及其后面还没用过的都比它大——一下子就能加上整段的个数,爽不爽。整体是  时间,空间搞个辅助数组就够了。

publicclassSolution{
publiclongreversePairs(int[] nums){
if (nums == null || nums.length < 2) return0L;
int n = nums.length;
int[] tmp = newint[n];
return sortCount(nums, 0, n - 1, tmp);
    }

privatelongsortCount(int[] a, int l, int r, int[] tmp){
if (l >= r) return0L;
int m = l + (r - l) / 2;
long cnt = 0L;
        cnt += sortCount(a, l, m, tmp);
        cnt += sortCount(a, m + 1, r, tmp);
// 小优化:已经有序就不合并
if (a[m] <= a[m + 1]) return cnt;
        cnt += mergeAndCount(a, l, m, r, tmp);
return cnt;
    }

privatelongmergeAndCount(int[] a, int l, int m, int r, int[] tmp){
for (int i = l; i <= r; i++) tmp[i] = a[i];
int i = l, j = m + 1, k = l;
long cnt = 0L;
while (k <= r) {
if (i > m) {
                a[k++] = tmp[j++];
            } elseif (j > r) {
                a[k++] = tmp[i++];
            } elseif (tmp[i] <= tmp[j]) { // 注意等号,避免把相等误算成逆序
                a[k++] = tmp[i++];
            } else {
                a[k++] = tmp[j++];
                cnt += (m - i + 1); // 左边这一段都比右边当前小家伙大
            }
        }
return cnt;
    }

// 小测一下
publicstaticvoidmain(String[] args){
        Solution s = new Solution();
        System.out.println(s.reversePairs(newint[]{3, 1, 2})); // 2
    }
}

昨晚有人问我“为啥用 long?”因为最大逆序对数能到 。n=100000 的时候是五十亿多,int 直接炸。还有就是比较用 <=,否则像 [2,2] 会被误判一对,实际不算,题目是严格大于才叫逆序。再有,合并那步别忘了先把区间复制到 tmp,不然你一边读一边改,顺序全糟了。

要是数组数值范围不大,还可以用树状数组或线段树那套“离散化 + 前缀计数”,边扫边加减,也能到 。不过说实话,面试现场我九成直接上归并数数,写得快、错得少。

-END-

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

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