Python技术迷

从字节平薪跳槽?网友:你就偷着乐吧

最近,我正在网上冲浪时,眼睛一亮,看见一个有意思的帖子:“平薪跳槽,这操作6啊!”看到这,我就来劲了。

Image

事情是这样的,发帖的网友,在字节跳动薪资不高,这次跳槽到了联通。但是后面网友回帖说的是联通的外包岗位,他们给出的薪资区间是12-18k,但网友连15k都没谈到。

Image

然而不明真相的网友们羡慕嫉妒恨了:“从字节平薪跳到联通,你就偷着乐吧。”

Image

又有网友提出了疑问:“联通怎么可能接得住字节的薪资呢?”而且不少人都点头表示赞同。

Image

还有网友调侃:“跟运营商打交道?你得有三宝:能吹、能喝、会来事。你会几样?”还得是网友懂得多啊。

Image

怎么说呢?如果真是正编,这谁不心动啊,但是是外包,而且还压薪资,是挺离谱的。网友的选择相信也是大部分人的选择,怎么可能去干外包,得多想不开啊。

下面是今日的大厂算法题
今日算法题,来自LeetCode的第37题:解数独,下面是我的算法思路及实现,让我们来看看吧。
算法题目

编写一个程序,通过已填充的空格解决数独问题。一个数独的解法需遵循如下规则:

1. 数字 1-9 在每一行只能出现一次。

2. 数字 1-9 在每一列只能出现一次。

3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

4. 空白格用 '.' 表示。

专属福利 
👉点击领取:最全Python资料合集
算法思路
  1. 遍历数独:从第一行第一列开始,遍历数独中的每一个空格。

  2. 尝试填充:对于每个空格,尝试填充数字 1 到 9。

  3. 检查有效性:每次填充后,检查当前填充的数字是否满足数独的规则(即检查行、列及 3x3 宫内是否重复)。

  4. 递归填充下一个空格:如果当前填充数字合法,递归地填充下一个空格。如果遍历完所有空格都能合法填充,则找到一个解。

  5. 回溯:如果某次填充无法最终解决数独问题,则撤销这次填充(回溯),尝试下一个数字。

代码实现

Java实现

public class Solution {    public void solveSudoku(char[][] board) {        solve(board);    }
private boolean solve(char[][] board) { for (int row = 0; row < board.length; row++) { for (int col = 0; col < board[0].length; col++) { if (board[row][col] == '.') { for (char num = '1'; num <= '9'; num++) { if (isValid(board, row, col, num)) { board[row][col] = num; if (solve(board)) return true; board[row][col] = '.'; } } return false; } } } return true; }
private boolean isValid(char[][] board, int row, int col, char num) { for (int i = 0; i < 9; i++) { if (board[i][col] == num || board[row][i] == num) return false; if (board[3 * (row / 3) + i / 3][3 * (col / 3) + i % 3] == num) return false; } return true; }}
JavaScript实现
const solveSudoku = function(board) {    const isValid = (row, col, num) => {        for (let i = 0; i < 9; i++) {            if (board[i][col] === num || board[row][i] === num) return false;            if (board[3 * Math.floor(row / 3) + Math.floor(i / 3)][3 * Math.floor(col / 3) + i % 3] === num) return false;        }        return true;    };
const solve = () => { for (let row = 0; row < 9; row++) { for (let col = 0; col < 9; col++) { if (board[row][col] === '.') { for (let num = '1'; num <= '9'; num++) { if (isValid(row, col, num)) { board[row][col] = num; if (solve()) return true; board[row][col] = '.'; } } return false; } } } return true; };
solve();};
Go实现
package main
func solveSudoku(board [][]byte) { solve(board)}
func solve(board [][]byte) bool { for row := 0; row < 9; row++ { for col := 0; col < 9; col++ { if board[row][col] == '.' { for num := '1'; num <= '9'; num++ { if isValid(board, row, col, byte(num)) { board[row][col] = byte(num) if solve(board) { return true } board[row][col] = '.' } } return false } } } return true}
func isValid(board [][]byte, row int, col int, num byte) bool { for i := 0; i < 9; i++ { if board[i][col] == num || board[row][i] == num { return false } if board[3*(row/3)+i/3][3*(col/3)+i%3] == num { return false } } return true}

算法解析

这种解法的时间复杂度较高,因为它尝试了所有可能的填充方式。然而,由于数独的特殊结构,实际运行时间通常远低于最坏情况。空间复杂度主要取决于递归调用栈的深度,理论上最多为81(数独的格数)。
示例和测试

以一个具体的数独问题为例,我们可以使用上述代码来解决。首先,初始化一个数独板,然后调用 `solveSudoku` 方法。执行后,原地修改数独板,填入解答。

总结
递归回溯法是解决数独问题的一种有效方法。虽然它在理论上的时间复杂度较高,但在实践中通常能够快速找到解决方案。
Image
 1
Image
热门推荐

Image