程序员老鬼

被面试官羞辱。。。

想必大家都知道现在求职不容易,尤其是面对大厂,那就更不容易了。这不,刚刚就看到一位网友分享的辛酸经历。

他之前在投简历的时候有些浮躁,随意地投了几份简历到一些大厂。第一轮面试还挺顺利,轻松聊着技术栈和工作经历,感觉还不错。

但到了第二轮面试就完全变了味道。面试官是部门领导,一上来就给人一股压迫感,问的问题也越来越刁钻,甚至有些不友好。最后,一个复杂的编程问题几乎让他崩溃了。

Image

我觉得吧,面试不仅是技术的考验,还真是心理战。所以啊,别像他那样,机会来了,不管心情如何,都得认真对待。毕竟,面试不只是找工作,还能学到不少东西。

Image

要是碰到不讲理的面试官,咱也别太往心里去。这世上,和谐的面试环境才能真正帮助大家找到合适的位置。

下面是今日的大厂算法题

现在环境就这样,不管是大厂还是小厂的笔面试题都会考察算法,所以算法是你内卷路上不可或缺的模块。下面是今日算法题,来自LeetCode的第51题:N 皇后 II 问题,下面是我的算法思路及实现,让我们来看看吧。

算法题目

给定一个整数 N,返回 N 皇后问题的不同解决方案的数量。

引言

N 皇后 II 是对 N 皇后问题的一个扩展,其目的是仅计算所有不同的解决方案的数量,而不需要实际展示棋盘布局。该问题同样考验对递归、回溯及剪枝技术的掌握。

算法思路

  1. 递归回溯: 使用递归函数尝试每一列的每一行,通过回溯来尝试所有可能的布局。
  2. 剪枝: 利用集合记录攻击线,以避免皇后之间的相互攻击。
  3. 计数优化: 只计算解的数量,而不生成棋盘的具体布局。

代码实现

JavaScript实现

function totalNQueens(n) {    let count = 0;    const columns = new Set();    const diagonals1 = new Set();    const diagonals2 = new Set();
function backtrack(row) { if (row === n) { count++; return; } for (let i = 0; i < n; i++) { if (columns.has(i) || diagonals1.has(row + i) || diagonals2.has(row - i)) continue; columns.add(i); diagonals1.add(row + i); diagonals2.add(row - i); backtrack(row + 1); columns.delete(i); diagonals1.delete(row + i); diagonals2.delete(row - i); } }
backtrack(0); return count;}

Java实现

public class Solution {    public int totalNQueens(int n) {        int[] count = new int[1];        boolean[] columns = new boolean[n];        boolean[] diagonals1 = new boolean[2 * n - 1];        boolean[] diagonals2 = new boolean[2 * n - 1];
backtrack(0, n, columns, diagonals1, diagonals2, count); return count[0]; }
private void backtrack(int row, int n, boolean[] columns, boolean[] diagonals1, boolean[] diagonals2, int[] count) { if (row == n) { count[0]++; return; } for (int i = 0; i < n; i++) { if (columns[i] || diagonals1[row + i] || diagonals2[row - n + 1 + i]) continue; columns[i] = true; diagonals1[row + i] = true; diagonals2[row - n + 1 + i] = true; backtrack(row + 1, n, columns, diagonals1, diagonals2, count); columns[i] = false; diagonals1[row + i] = false; diagonals2[row - n + 1 + i] = false; } }}

Python实现

def total_n_queens(n):    def backtrack(row):        if row == n:            nonlocal count            count += 1            return        for i in range(n):            if i in columns or (row + i) in diagonals1 or (row - i) in diagonals2:                continue            columns.add(i)            diagonals1.add(row + i)            diagonals2.add(row - i)            backtrack(row + 1)            columns.remove(i)            diagonals1.remove(row + i)            diagonals2.remove(row - i)
count = 0 columns = set() diagonals1 = set() diagonals2 = set() backtrack(0) return count

Go实现

func totalNQueens(n int) int {    count := 0    columns := make([]bool, n)    diagonals1 := make([]bool, 2*n-1)    diagonals2 := make([]bool, 2*n-1)
var backtrack func(int) backtrack = func(row int) { if row == n { count++ return } for i := 0; i < n; i++ { if columns[i] || diagonals1[row+i] || diagonals2[row-i+n-1] { continue } columns[i] = true diagonals1[row+i] = true diagonals2[row-i+n-1] = true backtrack(row + 1) columns[i] = false diagonals1[row+i] = false diagonals2[row-i+n-1] = false } }
backtrack(0) return count}

算法解析

通过优化的回溯方法,我们可以有效地计算出所有可能的解决方案的数量,而无需生成每个具体的棋盘配置。

示例和测试

以 N = 4 为例,可能的解决方案数量为 2。这反映了两种不同的方式,皇后可以互不攻击地放置在棋盘上。

总结

N 皇后 II 问题通过计算解决方案数量,提供了对 N 皇后问题深入理解的另一种方式。本文的方法和实现展示了如何高效地解决这类问题,希望能够帮助你在解决其他复杂算法问题时也能运用这些技巧。

我是何老师,一位AI创业者,擅长各类AI的深度玩法,通过AI工具实现3个月涨粉20w+。代表团队参加多场创新创业大赛,其中在成都和重庆联合举办的创新创业大赛中,凭借着团队出色的AI项目获得二等奖的好成绩,并成功当选当地青联委员。

Image

推荐阅读:

Image