程序员老鬼

华子员工爆料:不是35岁啊,我们部门招od的说30岁以上的简历就不看了。除非很优秀的

最近有个热点话题在程序员圈里炸开了锅,那就是华子公司员工的一条爆料:

他们部门在招OD(运营开发)的时候,简历上写到30岁以上的基本就直接pass,除非真的特别牛,否则连看都不看。这消息一出,不少同行表示震惊,但也有人开始“点头”。真的是这样吗?

Image

我觉得啊,事情可能没那么简单,背后可能有一些我们看不到的隐情。

首先,现在很多公司都面临着“年轻化”的压力,尤其是一些技术岗位,普遍偏爱年轻人。这并不代表年纪大的程序员不行,而是因为市场上年轻的技术人才更容易适应快速变化的环境,薪资要求也相对较低。

不过,30岁真的就成了“年龄门槛”吗?我倒觉得,不同的岗位和公司,情况会有差异。

如果你真有牛逼的技术实力和经验,就算30岁以上,也完全可以用实力打破这个“年龄墙”。再说了,很多年纪大一点的程序员,其实积累了更丰富的项目经验,解决问题的思路更加成熟,往往能带来比年轻人更高的生产力。

总之,年龄这事儿,不是唯一的标准。技术和经验才是你真正的竞争力!【备注:文末可领最新资料】。

算法题:有效的井字游戏

最近刷题的时候看到一道经典的算法题,名字很直白——有效的井字游戏。

首先,先看看题目要求。题目给了一个3x3的棋盘,你需要判断当前的棋盘状态是否可能是一个有效的井字游戏的局面。也就是说,你需要检查以下几点:

  1. 游戏应该从空棋盘开始,玩家轮流进行“X”和“O”放置。
  2. 如果“X”获胜,那么在游戏结束后就不能再进行“X”的操作,反之亦然。
  3. 也就是说,如果“X”和“O”同时获胜,那么这是一个不可能发生的局面。

这道题的难点其实在于状态的有效性判定。你得确认游戏在任何时候都遵循了规则,而且不管谁胜利,另一个玩家的操作也不能继续。

接下来,我会用Java来给大家写一个解法,代码走一遍,然后讲讲我怎么思考的。

public class Solution {
    public boolean validTicTacToe(String[] board) {
        // 检查棋盘上每个玩家的棋子数是否合法
        int xCount = 0, oCount = 0;
        for (String row : board) {
            for (char c : row.toCharArray()) {
                if (c == 'X') xCount++;
                else if (c == 'O') oCount++;
            }
        }

        // X的数量不能比O多1以上
        if (xCount != oCount && xCount != oCount + 1) return false;

        // 判断是否有“X”或“O”胜利
        boolean xWins = checkWinner(board, 'X');
        boolean oWins = checkWinner(board, 'O');

        // 规则1:如果“X”赢了,必须是X比O多1个
        if (xWins && xCount != oCount + 1) return false;

        // 规则2:如果“O”赢了,X的数量必须等于O
        if (oWins && xCount != oCount) return false;

        // 规则3:如果“X”和“O”都赢了,显然不可能
        if (xWins && oWins) return false;

        return true;
    }

    // 检查某个玩家是否胜利
    private boolean checkWinner(String[] board, char player) {
        // 检查行
        for (int i = 0; i < 3; i++) {
            if (board[i].charAt(0) == player && board[i].charAt(1) == player && board[i].charAt(2) == player)
                return true;
        }

        // 检查列
        for (int i = 0; i < 3; i++) {
            if (board[0].charAt(i) == player && board[1].charAt(i) == player && board[2].charAt(i) == player)
                return true;
        }

        // 检查对角线
        if (board[0].charAt(0) == player && board[1].charAt(1) == player && board[2].charAt(2) == player)
            return true;
        if (board[0].charAt(2) == player && board[1].charAt(1) == player && board[2].charAt(0) == player)
            return true;

        return false;
    }
}

这段代码实现了以下几个步骤:

  1. 计数:首先我们计算棋盘上“X”和“O”的数量。如果“X”的数量比“O”多了超过1,或者“O”的数量比“X”多,这个棋盘一定是无效的。因为在一个有效的井字游戏中,“X”和“O”应该交替出现,最多只有1个棋子会比另一个多。

  2. 判断获胜条件:接着,分别检查是否有玩家已经获胜。判断一个玩家是否获胜的条件就是:横、竖、斜线上都要有相同的棋子。如果“X”或“O”有任何一方胜利,我们就根据规则进一步判断局面是否合法。比如,只有“X”获胜时,才能保证“X”的数量比“O”多1;而“O”获胜时,二者的数量应该相等。

  3. 多个赢家的情况:最后,我们还要检查是否有“X”和“O”同时获胜的情况。如果有,那显然是不可能的局面,因为游戏已经结束了,不能继续进行。

从代码上看,其实逻辑是很清晰的。唯一需要注意的地方是判断“X”和“O”是否同时胜利的情况,这是一个特别容易忽略的陷阱。

如果你已经刷了很多算法题,可能会觉得这道题其实并不复杂,但在实际的面试中,这类题目其实可以反映出一个程序员在细节处理上的能力。如果你把“X”和“O”同时获胜的情况忘掉,那就会导致错误的答案。所以,编写代码时不仅要考虑常规的情况,还要细心地排查一些边缘的特殊情况。

-END-

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

Image

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