一网友说自己34岁了,211硕士,月薪才1万7,她妈在老家都抬不起头,大家都说她花那么多心思培养一个女儿,结果34岁了月薪才1万7,都达不到上海的平均水平。
就目前来看上海的平均月薪还远远达不到1万7,不管多少岁,我觉得月薪能达到1万7已经非常不错了,我们来看下其他网友的评论。
30多岁月薪到底多少才算正常呢?其实这个并没有一个正确的答案。因为不同的地方,不同的岗位,薪资差别是很大的。就比如说对于一个一线城市的程序员来说,34岁月薪才1万7,确实是有点低了。
说到程序员我们就来看一道和程序员有关的面试题,这题是LeetCode第36题:有效的数独。这题在字节和蚂蚁的面试中都考过,我们来看下。
问题描述
来源:LeetCode第36题
难度:中等
请你判断一个 9 x 9 的数独是否有效。只需要根据以下规则 ,验证已经填入的数字是否有效即可。
1,数字 1-9 在每一行只能出现一次。
2,数字 1-9 在每一列只能出现一次。
3,数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
注意:
1,一个有效的数独(部分已被填充)不一定是可解的。
2,只需要根据以上规则,验证已经填入的数字是否有效即可。
3,空白格用 '.' 表示。
示例1:
输入:board =
[["5","3",".",".","7",".",".",".","."]
,["6",".",".","1","9","5",".",".","."]
,[".","9","8",".",".",".",".","6","."]
,["8",".",".",".","6",".",".",".","3"]
,["4",".",".","8",".","3",".",".","1"]
,["7",".",".",".","2",".",".",".","6"]
,[".","6",".",".",".",".","2","8","."]
,[".",".",".","4","1","9",".",".","5"]
,[".",".",".",".","8",".",".","7","9"]]
输出:true
board.length == 9
board[i].length == 9
board[i][j] 是一位数字(1-9)或者 '.'
问题分析
数独大家应该都玩过吧,就是每行每列以及每个9宫格内都不能有重复的数字,这题让判断数独中已经填入的数字是否有效。因为每行每列以及每个9宫格最多只能有9个数字,所以我们可以使用位运算来解决。
比如line[i]就表示第 i 行的状态,如果第 i 行有一个 3 我们就在数字line[i]的二进制中第 3 位标记为 1 ,如果第 i 行有一个 5 我们就在数字line[i]的二进制中第 5 位标记为 1 ,如下图所示。
如果我们在标记某个位置之前,该位置已经被标记过,说明出现了重复数字,那么这个数独就是无效的,代码如下。
JAVA:
public boolean isValidSudoku(char[][] board) {
int[] line = new int[9];// 行
int[] col = new int[9];// 列
int[] cell = new int[9];// 9宫格
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
// 如果当前位置没有数字,不用判断。
if (board[i][j] == '.')
continue;
int shift = 1 << (board[i][j] - '0');// 确定第几位
int k = (i / 3) * 3 + j / 3;// 9宫格的第几个。
// 如果对应的位置只要有一个被标记过,说明有冲突,直接返回false。
if ((col[i] & shift) > 0 || (line[j] & shift) > 0
|| (cell[k] & shift) > 0)
return false;
// 把当前位置所在的行,列以及9宫格都标记为该数字已经存在。
col[i] |= shift;
line[j] |= shift;
cell[k] |= shift;
}
}
return true;
}
C++:
public:
bool isValidSudoku(vector<vector<char>>& board) {
int line[9]= {0}; // 行
int col[9] = {0}; // 列
int cell[9] = {0}; // 9宫格
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
// 如果当前位置没有数字,不用判断。
if (board[i][j] == '.')
continue;
int shift = 1 << (board[i][j] - '0');// 确定第几位
int k = (i / 3) * 3 + j / 3;// 9宫格的第几个。
// 如果对应的位置只要有一个被标记过,说明有冲突,直接返回false。
if ((col[i] & shift) > 0 || (line[j] & shift) > 0
|| (cell[k] & shift) > 0)
return false;
// 把当前位置所在的行,列以及9宫格都标记为该数字已经存在。
col[i] |= shift;
line[j] |= shift;
cell[k] |= shift;
}
}
return true;
}
-------------------------end-------------------------
笔者简介
博哥,真名:王一博,毕业十多年,《算法秘籍》作者,专注于数据结构和算法的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解700多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以下载我整理的1000多页的PDF算法文档。