程序员老鬼

在开发过程中使用 git rebase 还是 git merge,优缺点分别是什么?

在逛论坛的时候看到一个老生常谈但依然争议满满的帖子:“在开发过程中使用 git rebase 还是 git merge,优缺点分别是什么?”我一看这题,熟!Image
作为一枚长期和 Git 搏斗的程序员,我觉得这个问题就像是在问吃火锅要不要蘸酱,怎么选主要看你想吃得爽还是吃得优雅。
merge 像个憨厚老实的搬砖工,分支一合,事儿就完,冲突也不多,适合团队大协作,不容易踩雷。但问题是,历史记录那叫一个混乱,看起来像谁都没好好上班。
而 rebase 呢,就像把提交历史拿去做了个精修,线性整洁,赏心悦目,适合代码洁癖型程序员。但一不小心就会搞出点大新闻,比如历史重写、冲突地狱、同事问候你全家那种……
所以我一般的做法是:本地分支自己搞干净用 rebase,到了合作分支就老实点 merge 吧,别让代码和队友一起爆炸。【备注:文末可领最新资料】

算法题:柱状图中最大的矩形

面试中有一种题,一上来我就会心一笑:你猜我没刷,但我偏刷过,那就是「柱状图中最大的矩形」。
这题有多常见呢?就像加班后的泡面,闻着熟悉,吃起来心里发苦。
先简单说下题目:
给你一个数组,每个元素表示柱状图中某根柱子的高度,柱子宽度都固定为1,让你求最大矩形面积。
看着像是个暴力解法能搞定的题对吧?确实,for-for-while三板斧上去能拿下,只不过效率感人,O(n²)起步,跑起来跟老年机一样卡。
程序员的尊严不允许我交出这种解法,所以得上点技术含量的。
要解这个题,其实最优雅的解法是用单调栈。别听着吓人,栈不就是先进后出嘛,加个“单调”俩字,就表示这个栈在维护一种顺序,通常是递增或者递减。
咱来点干货吧,用 Java 实现下经典的单调栈解法👇:
好的!下面是带有详细中文注释的 Java 实现代码,配合前面提到的单调栈解法:
publicintlargestRectangleArea(int[] heights){    Stack<Integer> stack = new Stack<>(); // 栈中存的是柱子的下标,用于后续计算宽度    int maxArea = 0;    int n = heights.length;
    // 遍历每根柱子,并在最后加一个高度为0的柱子,确保栈里能被清空    for (int i = 0; i <= n; i++) {        // 当前柱子的高度,最后一个位置作为哨兵处理,设为0        int currentHeight = (i == n ? 0 : heights[i]);
        // 如果当前柱子比栈顶柱子矮,则说明栈顶柱子右边界找到了,开始结算        while (!stack.isEmpty() && currentHeight < heights[stack.peek()]) {            int height = heights[stack.pop()]; // 弹出栈顶柱子高度            // 计算宽度:如果栈为空说明左边全都比它高,宽度为i            // 否则宽度为当前下标i减去新的栈顶下标再减1            int width = stack.isEmpty() ? i : i - stack.peek() - 1;            int area = height * width; // 计算面积            maxArea = Math.max(maxArea, area); // 更新最大面积        }
        // 当前柱子入栈(注意是下标)        stack.push(i);    }
    return maxArea;}
代码不长,但很灵。我们往里面压的是柱子的下标,这样可以方便计算宽度。然后每次遇到「当前柱子高度小于栈顶柱子」,就说明栈顶柱子遇到了右边第一个比它小的,也就是结算的时候了。
这里很多人第一次接触会卡在宽度的计算上,简单理解一下就像是“栈顶柱子能往左往右扩展到什么范围”。往左就是下一个比它小的柱子,往右是当前柱子的位置。栈里保存的是递增序列,所以能保证每次出栈的时候,左边比它小的已经在栈底下了。
有点像办公室那种人——平时话不多,一旦开口就掷地有声:该干活时,从来不含糊。
这道题特别能看出一个程序员对栈结构的掌握情况。你要真懂了,其实还能进一步抽象到“下一个更小元素”这类通用模型。像什么接雨水、每日温度、滑动窗口之类的题,全都可以串成一串打包理解。
当然,平时项目里不太会用到“柱状图最大矩形”,但你要是在系统优化、图形界面布局、或者某些数据可视化场景里搞自定义布局的逻辑,有些背后的思想就是从这类题演化来的。
写这类代码时,我脑海里总会浮现一个画面:一堆柱子静静地站在那儿,等待我用栈把它们一个个弹出来——一边弹,一边收割面积,像极了老板收割我周末加班的时间😩
所以我觉得啊,这类算法题就像生活中的理财,你不能盯着眼前那点小柱子(收益),得懂得左右扩展,找到最优解(最大面积),这样程序人生才能不白忙活。
技术点掌握住了,代码刷顺了,哪怕面试官扔个“困难”标签,也得被你稳稳接住。
最后给还没刷过这题的朋友一句建议:别怕,Java写这题就像背九九乘法表一样,熟能生巧,栈清了,脑也通了

最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek

也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。

-END-

ok,今天先说到这,老规矩,给大家分享一份不错的副业资料,感兴趣的同学可以链接我,微信:hls404 找我领取。

以上,就是今天的分享了,看完文章记得右下角点赞,也欢迎在评论区写下你的留言。