某疆员工爆料:准备给一个34岁的降薪50%,结果他刚离婚没软肋了,就把矛头转向另一个31岁,刚结婚准备要小孩的。。

科技   2024-11-24 13:13   山西  
最近看到一个帖子,说的是某疆员工爆料:本来公司准备给一个34岁员工降薪50%,结果发现他刚离婚,没了软肋,这哥们反手就把矛头转向了另一个31岁刚结婚、准备要孩子的同事。

这波操作.....,就挺不某疆的,因为某疆的薪资是真的没有这么低~

不过这种事情在互联网倒是真实存在的,而且还蛮多的,大家要是不想出现上面这种情况,就要注意了
1.保护自己的隐私。不要把自己的婚姻、家庭、财务状况全盘托出,谁知道这些信息会不会有一天变成别人手里的“降薪理由”。
2.学会装。“有难同当”那是假的。公司是真“断舍离”高手,该降你薪时从不犹豫,必要时咱也得学会“表面上配合,心里另打算盘”。
最后,我想说,这年头,离婚不是软肋。职场唯一靠谱的,是自己手里的本事和对环境的敏锐判断力。

算法:直线上最多的点数

最近刷题的时候,我看到一个题目叫“直线上最多的点数”。这个题目看似简单,实则内涵丰富。

题目解析

题目很简单,给你一堆点的坐标,问这些点中最多有多少个点能在一条直线上。别小看它,这里面涉及到数学和算法的结合,有点东西。
刚开始我的脑袋里飘过的只有暴力解法:遍历每两个点,计算斜率,再看看哪些点共线。
但理智告诉我,暴力不可取啊!就像用O(n²)的代码处理生产环境的百万级数据,迟早要被产品经理和运维哥哥联合追着跑。

那咋办?

先来拆解这个问题。判断点是否共线,我们的关键是斜率。斜率相同的点就意味着它们在一条直线上。

实现思路

  1. 遍历每个点,把它当作基点。
  2. 对于每个基点,计算其他点与它的斜率。
  3. 用一个哈希表统计每个斜率出现的次数。
  4. 每次统计完后,取最大值,更新结果。
细节注意点:
  • 斜率可能是小数,要注意精度问题。常规操作是用分数来表示斜率,分子和分母取最大公约数化简。
  • 垂直的点用特殊标记,比如斜率是Infinity
  • 如果两个点重合,算到重复点中即可。

手撸代码

看起来挺有道理?上代码,看看实现:
import java.util.HashMap;

public class MaxPointsOnLine {
    public int maxPoints(int[][] points) {
        if (points == null || points.length == 0return 0;
        int maxPoints = 1;

        for (int i = 0; i < points.length; i++) {
            HashMap<String, Integer> slopeMap = new HashMap<>();
            int overlap = 0;
            int localMax = 0;

            for (int j = i + 1; j < points.length; j++) {
                int dx = points[j][0] - points[i][0];
                int dy = points[j][1] - points[i][1];

                if (dx == 0 && dy == 0) {
                    overlap++;
                    continue;
                }

                int gcd = getGCD(dx, dy); // 分子分母化简
                dx /= gcd;
                dy /= gcd;

                // 构造唯一斜率字符串
                String slope = dx + "/" + dy;
                slopeMap.put(slope, slopeMap.getOrDefault(slope, 0) + 1);
                localMax = Math.max(localMax, slopeMap.get(slope));
            }

            maxPoints = Math.max(maxPoints, localMax + overlap + 1); // 加上基点和重叠点
        }

        return maxPoints;
    }

    // 辗转相除法求最大公约数
    private int getGCD(int a, int b) {
        if (b == 0return a;
        return getGCD(b, a % b);
    }

    public static void main(String[] args) {
        MaxPointsOnLine solution = new MaxPointsOnLine();
        int[][] points = {{1, 1}, {2, 2}, {3, 3}, {4, 2}};
        System.out.println(solution.maxPoints(points)); // 输出:3
    }
}

有趣的细节

  1. 哈希表存斜率:用dx/dy的形式存储,避免浮点数精度问题。想用小数直接比对的,基本就是“踩坑手册”上的常客。
  2. 重合点处理:别忘了基点和重复点会影响计数,就像代码中的overlap变量。
  3. GCD化简:这是亮点。用最大公约数化简分子和分母,像处理分数一样优雅。
这种题目最难的地方不是写代码,而是先理清楚算法思路。有时候做题让我感觉像在debug自己的脑子,找到一个清晰的解决路径,简直是一种成就感。🤓
对编程、职场感兴趣的同学,可以链接我,微信:coder301 拉你进入“程序员交流群”。
🔥东哥私藏精品 热门推荐🔥

东哥作为一名超级老码农,整理了全网最全《Java高级架构师资料合集》

资料包含了《IDEA视频教程》《最全Java面试题库》、最全项目实战源码及视频》及《毕业设计系统源码》总量高达 650GB 。全部免费领取!全面满足各个阶段程序员的学习需求。

Java面试那些事儿
回复 java ,领取Java面试题。分享AI编程,Java教程,Java面试辅导,Java编程视频,Java下载,Java技术栈,AI工具,Java开源项目,Java简历模板,Java招聘,Java实战,Java面试经验,IDEA教程。
 最新文章