专栏名称: 鸭哥聊Java
回复关键字:666 ,领取免费简历模板,Java面试题,Java编程视频等。本号内容涵盖Java源码,JVM源码,Dubbo源码,Spring源码,Spring Cloud微服务架构,分布式高并发架构技术,MySQL性能调优等。
目录
相关文章推荐
Java编程精选  ·  字节员工疑问:为什么大厂客户端宁愿用28k招 ... ·  2 天前  
芋道源码  ·  DeepSeek浪潮,Spring也赶上了?! ·  2 天前  
芋道源码  ·  SpringBoot ... ·  2 天前  
芋道源码  ·  java 插入式注解的打开方式! ·  4 天前  
51好读  ›  专栏  ›  鸭哥聊Java

原来如此,所以很多公司都不招大龄程序员了。。。

鸭哥聊Java  · 公众号  ·  · 2025-01-22 10:53

正文

最近看到一篇帖子,讨论了为什么很多公司不愿意招大龄程序员,原因其实挺简单。

程序员大致分两类:第一类是技术牛人,他们完全沉浸在技术里,通常在大公司非常吃香,但小公司往往理解不了他们的价值,也用不上这么高水平的人才。

第二类是技术一般,早早转做技术管理的,这类人虽然能依靠团队带来成果,但个人技术水平相对较低,缺乏对新技术的敏感性,很多大公司不需要,小公司也因技术不足而不愿录用。

而现在的技术已经不再是唯一的“硬通货”,能够提出系统性解决方案和有整体把握的能力变得越来越重要,尤其是在AI时代。

很多工作已经不需要特别高深的技术,开源工具都能解决问题。所以很多公司并不看重“技术大牛”,反而更需要能解决问题、带团队的人。

说白了,技术过剩、管理困难,再加上企业对效率的追求,大龄程序员找工作确实不容易 【备注:文末可领最新资料】

今日面试题


好了,我们回归正题, 今天我们来聊一聊“ 凸多边形 ”。如果你曾经在做算法题时碰到过“判断一个多边形是不是凸的”这样的题目,或许你会感到有点困惑,甚至有些人会觉得这个概念听起来很复杂,但其实,它并不难理解。

先给大家铺垫一下基本概念,凸多边形的定义其实非常简单。我们知道,普通的多边形是由一组点连接起来的,它的边缘形成一个封闭的图形。

那么,如果这个图形是“凸”的,意思就是从图形内部的任意两点连线,始终会被多边形本身包含在内。换句话说,图形内部没有任何点会被“凸出”到多边形外面。如果从几何角度理解就是,每个内角都小于180度。

现在你可能会问了:“这和程序员我有啥关系呢?” 好问题!作为程序员,理解和判断一个图形是不是凸多边形,往往和计算几何有关。比如在做碰撞检测、路径规划、或者做一些图形的图形处理时,凸多边形的判断是一个基础而重要的技能。

为了更好地帮助大家理解这个问题,咱们可以通过编程来判断一个多边形是不是凸的。这里我给大家提供一个用Java来解决这个问题的方案。

首先,我们可以用数组来表示多边形的顶点,每个顶点用一个二维坐标表示。例如,一个多边形有四个点,顶点坐标可能是:

int[][] points = {
    {00}, 
    {40}, 
    {44}, 
    {04}
};

接下来,我们要判断的是,如何从这些点判断这个多边形是不是凸的。其实,判断凸多边形的关键在于检查每三个连续的顶点是否在同一侧。

换句话说,从第一个顶点开始,形成的每一条边与接下来的两点形成的向量应该始终指向同一方向,或者是逆时针方向,或者是顺时针方向。

我们可以通过叉积来判断两向量的方向。叉积是一个非常实用的工具,它可以帮助我们判断两向量的旋转方向。叉积的计算公式很简单:

设两个向量分别是 ,那么它们的叉积为: AB ×AC =(Bx−Ax)×(Cy−Ay)−(By−Ay)×(Cx−Ax)

通过这个叉积,我们可以判断三个点的方向。若叉积为正,说明是顺时针,若叉积为负,说明是逆时针;如果为零,说明三点共线。

利用这个思路,我们就可以逐个判断多边形的每一组三个相邻的顶点,看看它们的方向是否一致。只要有一组三个点的方向与其他点的方向不一致,那就说明这个多边形不是凸的。

下面是实现的Java代码:

public class ConvexPolygon {
    // 判断三点是否按顺时针、逆时针或共线排列
    public static int crossProduct(int[] p1, int[] p2, int[] p3) {
        return (p2[0] - p1[0]) * (p3[1] - p1[1]) - (p2[1] - p1[1]) * (p3[0] - p1[0]);
    }

    // 判断多边形是否是凸多边形
    public static boolean isConvex(int[][] points) {
        int n = points.length;
        if (n 3) return false// 少于3个点,不构成多边形

        // 用来记录前两次叉积的符号,判断方向是否一致
        Integer lastCrossProduct = null;

        for (int i = 0; i             int[] p1 = points[i];
            int[] p2 = points[(i + 1) % n]; // 保证环形访问
            int[] p3 = points[(i + 2) % n];

            int cross = crossProduct(p1, p2, p3);

            // 如果叉积不为0,表示有方向
            if (cross != 0) {
                if (lastCrossProduct == null) {
                    lastCrossProduct = cross; // 第一次设定方向
                } else {
                    // 如果叉积符号不同,说明方向不同,不是凸多边形
                    if (lastCrossProduct * cross 0) {
                        return false;
                    }
                }
            }
        }

        return true;
    }

    public static void main(String[] args) {
        int[][] points = {
            {00}, 
            {40}, 
            {44}, 
            {04}
        };
        
        if (isConvex(points)) {
            System.out.println("是凸多边形!");
        } else {
            System.out.println("不是凸多边形!");
        }
    }
}

这段代码的实现步骤非常清晰:首先,我们用 crossProduct 方法来计算每三个点的叉积;然后用 isConvex 方法判断多边形的每条边的叉积方向是否一致。如果有一组点的方向不同,就说明这个多边形不是凸的。如果所有方向一致,那就是凸多边形。

这里的逻辑其实就像是看一个人的走路姿势。你走路时,如果总是左脚先迈,右脚跟着迈,步伐就会很规律,但如果忽左忽右,那显然是不太协调的,对吧?而凸多边形就像是那种每一步都很统一、没有任何“曲线”的形状。

总结一下,虽然数学看起来有点复杂,但其实我们只要明白了核心的判断思路,使用简单的计算方法就能轻松判断一个多边形是否是凸的。这个技巧在实际应用中,比如做图形处理、碰撞检测等场景中,都会大有用处。

对编程、职场感兴趣的同学,可以链接我,微信:yagebug  拉你进入“程序员交流群”。






请到「今天看啥」查看全文