比亚迪
今天逛学生聚集地(牛客网)的时候,看到一篇前几天的帖子。
标题为「比亚迪,学历大于一切」。
这位发帖的同学指出,他曾在比亚迪工作,当时入职时级别为 G3/F1,目测自己工作三年也不一定能升到 E1,而一些学历较好的硕士应届生则可以直接以 E1 级别进入比亚迪。
这位同学提到:目前,比亚迪为了提升团队的高学历比例,所以只认学历。
除了入职时有更高职级以外,高学历的员工也更容易获得升职加薪的机会。
确实,别的公司可能会存在工资倒挂情况,但那毕竟是水底下的(相对保密),而比亚迪这种职级上的倒挂则是赤裸裸的明面上。
这是从制度建立时就不考虑老员工感受的企业,长期来说对留存率有害。
帖子底下有不少网友纷纷表示自己的看法:
对此,你怎么看呢 🤣🤣🤣
...
回归主线。
来做一道和「Build Your Dreams」相关的题目。
...
回归主线。
题目描述
平台:LeetCode
题号:1222
在一个 8x8
的棋盘上,放置着若干「黑皇后」和一个「白国王」。
给定一个由整数坐标组成的数组 queens
,表示黑皇后的位置;以及一对坐标 king
,表示白国王的位置,返回所有可以攻击国王的皇后的坐标(任意顺序)。
示例 1:
输入:queens = [[0,1],[1,0],[4,0],[0,4],[3,3],[2,4]], king = [0,0]
输出:[[0,1],[1,0],[3,3]]
解释:
[0,1] 的皇后可以攻击到国王,因为他们在同一行上。
[1,0] 的皇后可以攻击到国王,因为他们在同一列上。
[3,3] 的皇后可以攻击到国王,因为他们在同一条对角线上。
[0,4] 的皇后无法攻击到国王,因为她被位于 [0,1] 的皇后挡住了。
[4,0] 的皇后无法攻击到国王,因为她被位于 [1,0] 的皇后挡住了。
[2,4] 的皇后无法攻击到国王,因为她和国王不在同一行/列/对角线上。
示例 2:
输入:queens = [[0,0],[1,1],[2,2],[3,4],[3,5],[4,4],[4,5]], king = [3,3]
输出:[[2,2],[3,4],[4,4]]
示例 3:
输入:queens = [[5,6],[7,7],[2,1],[0,7],[1,6],[5,1],[3,7],[0,3],[4,0],[1,2],[6,3],[5,0],[0,4],[2,2],[1,1],[6,4],[5,4],[0,0],[2,6],[4,5],[5,2],[1,4],[7,5],[2,3],[0,5],[4,2],[1,0],[2,7],[0,1],[4,6],[6,1],[0,6],[4,3],[1,7]], king = [3,4]
输出:[[2,3],[1,4],[1,6],[3,7],[4,3],[5,4],[4,5]]
提示:
-
-
-
-
-
-
一个棋盘格上最多只能放置一枚棋子。
模拟
创建一个二维数组 dirs
来表示八个方向的坐标偏移,同时使用变量 step
来表示从国王位置出发的步数。
在每个方向 i
上,通过 step
步可以到达的坐标为
。
模拟过程中,我们可使用布尔数组 checked
来记录已处理的方向,当我们遇到皇后或越过棋盘时,可标记该方向已处理。
Java 代码:
class Solution {
int[][] dirs = new int[][]{{1,0},{0,1},{0,-1},{-1,0},{1,1},{-1,-1},{1,-1},{-1,1}};
public List<List<Integer>> queensAttacktheKing(int[][] qs, int[] k) {
boolean[][] vis = new boolean[10][10];
for (int[] q : qs) vis[q[0]][q[1]] = true;
int x = k[0], y = k[1], step = 1;
List<List<Integer>> ans = new ArrayList<>();
boolean[] checked = new boolean[8];
while (step <= 8) {
for (int i = 0; i < 8; i++) {
if (checked[i]) continue;
int nx = x + dirs[i][0] * step, ny = y + dirs[i][1] * step;
if (nx < 0 || nx >= 8 || ny < 0 || ny >= 8) {
checked[i] = true;
} else {
if (!vis[nx][ny]) continue;
List<Integer> list = new ArrayList<>();
list.add(nx); list.add(ny);
ans.add(list);
checked[i] = true;
}
}
step++;
}
return ans;
}
}
C++ 代码:
class Solution {
public:
vector<vector<int>> queensAttacktheKing(vector<vector<int>>& queens, vector<int>& king) {
vector<vector<int>> dirs {{1,0},{0,1},{0,-1},{-1,0},{1,1},{-1,-1},{1,-1},{-1,1}};
vector<vector<int>> ans;
vector<vector<bool>> vis(8, vector<bool>(8, false));
for (auto& queen : queens) vis[queen[0]][queen[1]] = true;
int x = king[0], y = king[1], step = 1;
vector<bool> checked(8, false);
while (step <= 8) {
for (int i = 0; i < 8; i++) {
if (checked[i]) continue;
int nx = x + step * dirs[i][0];
int ny = y + step * dirs[i][1];
if (nx < 0 || nx >= 8 || ny < 0 || ny >= 8) {
checked[i] = true;
} else {
if (!vis[nx][ny]) continue;
ans.push_back({nx, ny});
checked[i] = true;
}
}
step++;
}
return ans;
}
};
Python 代码:
class Solution:
def queensAttacktheKing(self, queens: List[List[int]], king: List[int]) -> List[List[int]]:
dirs = [[1,0],[0,1],[0,-1],[-1,0],[1,1],[-1,-1],[1,-1],[-1,1]]
vis = [[False] * 8 for _ in range(8)]
for q in queens:
vis[q[0]][q[1]] = True
x, y = king
ans = []
checked = [False] * 8
step = 1
while step <= 8:
for i in range(8):
if checked[i]: continue
nx, ny = x + dirs[i][0] * step, y + dirs[i][1] * step
if nx < 0 or nx >= 8 or ny < 0 or ny >= 8:
checked[i] = True
else:
if not vis[nx][ny]: continue
ans.append([nx, ny])
checked[i] = True
step += 1
return ans
TypeScript 代码:
function queensAttacktheKing(queens: number[][], king: number[]): number[][] {
let dirs = [[1,0],[0,1],[0,-1],[-1,0],[1,1],[-1,-1],[1,-1],[-1,1]];
let vis: boolean[][] = Array.from({length:8},()=>Array(8).fill(false));
for (let q of queens) vis[q[0]][q[1]] = true;
let x = king[0], y = king[1], step = 1;
let ans: number[][] = [];
let checked: boolean[] = Array(8).fill(false);
while (step <= 8) {
for (let i = 0; i < 8; i++) {
if (checked[i]) continue;
let nx = x + dirs[i][0] * step, ny = y + dirs[i][1] * step;
if (nx < 0 || nx >= 8 || ny < 0 || ny >= 8) {
checked[i] = true;
} else {
if (!vis[nx][ny]) continue;
ans.push([nx, ny]);
checked[i] = true;
}
}
step++;
}
return ans;
};
-
时间复杂度: ,其中 为棋盘总大小 -
空间复杂度: ,其中 为棋盘总大小
BFS
上述模拟过程也可以使用 BFS
方式进行。
相比于直接模拟,BFS
无须使用额外变量记录处理过的方向以及当前位置与国王的距离。
Java 代码:
class Solution {
int[][] dirs = new int[][]{{1,0},{0,1},{0,-1},{-1,0},{1,1},{-1,-1},{1,-1},{-1,1}};
public List<List<Integer>> queensAttacktheKing(int[][] qs, int[] k) {
boolean[][] vis = new boolean[10][10];
for (int[] q : qs) vis[q[0]][q[1]] = true;
Deque<int[]> d = new ArrayDeque<>();
for (int i = 0; i < 8; i++) {
int x = k[0] + dirs[i][0], y = k[1] + dirs[i][1];
if (x < 0 || x >= 8 || y < 0 || y >= 8) continue;
d.addLast(new int[]{x, y, i});
}
List<List<Integer>> ans = new ArrayList<>();
while (!d.isEmpty()) {
int[] info = d.pollFirst();
int x = info[0], y = info[1], p = info[2];
if (vis[x][y]) {
List<Integer> list = new ArrayList<>();
list.add(x); list.add(y);
ans.add(list);
} else {
int nx = x + dirs[p][0], ny = y + dirs[p][1];
if (nx < 0 || nx >= 8 || ny < 0 || ny >= 8) continue;
d.addLast(new int[]{nx, ny, p});
}
}
return ans;
}
}
C++ 代码:
class Solution {
public:
vector<vector<int>> queensAttacktheKing(vector<vector<int>>& queens, vector<int>& king) {
vector<vector<int>> dirs = {{1,0},{0,1},{0,-1},{-1,0},{1,1},{-1,-1},{1,-1},{-1,1}};
vector<vector<bool>> vis(8, vector<bool>(8, false));
for (vector<int>& queen : queens) vis[queen[0]][queen[1]] = true;
deque<vector<int>> d;
for (int i = 0; i < 8; i++) {
int x = king[0] + dirs[i][0], y = king[1] + dirs[i][1];
if (x < 0 || x >= 8 || y < 0 || y >= 8) continue;
d.push_back({x, y, i});
}
vector<vector<int>> res;
while (!d.empty()) {
vector<int> cur = d.front();
d.pop_front();
if (vis[cur[0]][cur[1]]) {
res.push_back({cur[0], cur[1]});
} else {
int nx = cur[0] + dirs[cur[2]][0], ny = cur[1] + dirs[cur[2]][1];
if (nx < 0 || nx >= 8 || ny < 0 || ny >= 8) continue;
d.push_back({nx, ny, cur[2]});
}
}
return res;
}
};
Python 代码:
class Solution:
def queensAttacktheKing(self, queens, king):
dirs = [[1,0],[0,1],[0,-1],[-1,0],[1,1],[-1,-1],[1,-1],[-1,1]]
vis = [[False]*8 for _ in range(8)]
for q in queens: vis[q[0]][q[1]] = True
d = deque()
for i in range(8):
x = king[0] + dirs[i][0]
y = king[1] + dirs[i][1]
if x < 0 or x >= 8 or y < 0 or y >= 8: continue
d.append([x, y, i])
ans = []
while d:
cur = d.popleft()
if vis[cur[0]][cur[1]]:
ans.append([cur[0], cur[1]])
else:
x = cur[0] + dirs[cur[2]][0]
y = cur[1] + dirs[cur[2]][1]
if x < 0 or x >= 8 or y < 0 or y >= 8: continue
d.append([x, y, cur[2]])
return ans
TypeScript 代码:
function queensAttacktheKing(queens: number[][], king: number[]): number[][] {
let dirs = [[1,0],[0,1],[0,-1],[-1,0],[1,1],[-1,-1],[1,-1],[-1,1]];
let vis: boolean[][] = Array(8).fill(false).map(() => Array(8).fill(false));
queens.forEach(q => vis[q[0]][q[1]] = true);
let d: number[][] = [];
for (let i = 0; i < 8; i++) {
let x = king[0] + dirs[i][0], y = king[1] + dirs[i][1];
if (x < 0 || x >= 8 || y < 0 || y >= 8) continue;
d.push([x, y, i]);
}
let res = [];
while (d.length !== 0) {
let cur = d.shift();
if (vis[cur[0]][cur[1]]) {
res.push([cur[0], cur[1]]);
} else {
let x = cur[0] + dirs[cur[2]][0], y = cur[1] + dirs[cur[2]][1];
if (x < 0 || x >= 8 || y < 0 || y >= 8) continue;
d.push([x, y, cur[2]]);
}
}
return res;
};
-
时间复杂度: ,其中 为四条线的总步数 -
空间复杂度: ,其中 为棋盘总大小
最后
给大伙通知一下 📢 :
全网最低价 LeetCode 会员目前仍可用!!!
📅 年度会员:有效期加赠两个月!!; 季度会员:有效期加赠两周!!
🧧 年度会员:获 66.66 现金红包!!; 季度会员:获 22.22 现金红包!!
🎁 年度会员:参与当月丰厚专属实物抽奖(中奖率 > 30%)!!
专属链接:leetcode.cn/premium/?promoChannel=acoier
我是宫水三叶,每天都会分享算法知识,并和大家聊聊近期的所见所闻。
欢迎关注,明天见。
更多更全更热门的「笔试/面试」相关资料可访问排版精美的 合集新基地 🎉🎉