被面试官羞辱。。。
他之前在投简历的时候有些浮躁,随意地投了几份简历到一些大厂。第一轮面试还挺顺利,轻松聊着技术栈和工作经历,感觉还不错。
但到了第二轮面试就完全变了味道。面试官是部门领导,一上来就给人一股压迫感,问的问题也越来越刁钻,甚至有些不友好。最后,一个复杂的编程问题几乎让他崩溃了。
我觉得吧,面试不仅是技术的考验,还真是心理战。所以啊,别像他那样,机会来了,不管心情如何,都得认真对待。毕竟,面试不只是找工作,还能学到不少东西。
要是碰到不讲理的面试官,咱也别太往心里去。这世上,和谐的面试环境才能真正帮助大家找到合适的位置。
下面是今日的大厂算法题
现在环境就这样,不管是大厂还是小厂的笔面试题都会考察算法,所以算法是你内卷路上不可或缺的模块。下面是今日算法题,来自LeetCode的第51题:N 皇后 II 问题,下面是我的算法思路及实现,让我们来看看吧。
算法题目
引言
算法思路
递归回溯: 使用递归函数尝试每一列的每一行,通过回溯来尝试所有可能的布局。 剪枝: 利用集合记录攻击线,以避免皇后之间的相互攻击。 计数优化: 只计算解的数量,而不生成棋盘的具体布局。
代码实现
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 countcount += 1returnfor i in range(n):if i in columns or (row + i) in diagonals1 or (row - i) in diagonals2:continuecolumns.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 = 0columns = set()diagonals1 = set()diagonals2 = set()backtrack(0)return count
Go实现
func totalNQueens(n int) int {count := 0columns := 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] = truediagonals1[row+i] = truediagonals2[row-i+n-1] = truebacktrack(row + 1)columns[i] = falsediagonals1[row+i] = falsediagonals2[row-i+n-1] = false}}backtrack(0)return count}
算法解析
示例和测试
总结
N 皇后 II 问题通过计算解决方案数量,提供了对 N 皇后问题深入理解的另一种方式。本文的方法和实现展示了如何高效地解决这类问题,希望能够帮助你在解决其他复杂算法问题时也能运用这些技巧。
我是何老师,一位AI创业者,擅长各类AI的深度玩法,通过AI工具实现3个月涨粉20w+。代表团队参加多场创新创业大赛,其中在成都和重庆联合举办的创新创业大赛中,凭借着团队出色的AI项目获得二等奖的好成绩,并成功当选当地青联委员。
推荐阅读: