Skip to content

Commit 47412f9

Browse files
committed
【update】字节跳动812笔试
1 parent e22d110 commit 47412f9

File tree

4 files changed

+205
-267
lines changed

4 files changed

+205
-267
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ __*/
88
out/
99

1010
# file
11+
-*
1112
*.zip
1213
*.tgz
1314
_test*.py

笔试面经/README.md

Lines changed: 4 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ Reference
55
---
66
- [BAT机器学习面试1000题系列(第1~305题)](https://blog.csdn.net/v_JULY_v/article/details/78121924) - CSDN博客
77

8+
笔试
9+
---
10+
- [字节跳动 180812](./笔试-字节跳动-180812.md)
11+
812
Index
913
---
1014
<!-- TOC -->
@@ -178,103 +182,3 @@ Index
178182
统计每个数字出现次数counter,以每个数字为基准,按照与基准差值对counter排序,优先替换差值小的数字;关于字典序的问题,如果替换的数比基准大则从前向后替换,如果替换的数比基准大,则从后向前替换,得到的就是字典序最小的字符串,时间复杂度O(n)
179183
> [拼多多算法岗笔试python解决方案](https://www.nowcoder.com/discuss/87694)_笔经面经_牛客网
180184
- TODO 目前还没看到完全 AC 的代码
181-
182-
183-
## [180812] 字节跳动笔试
184-
5 道编程题
185-
186-
### 1. 世界杯开幕式
187-
<div align="center"><img src="../assets/TIM截图20180812100103.png" height="" /></div>
188-
<div align="center"><img src="../assets/TIM截图20180812100122.png" height="" /></div>
189-
190-
**思路**
191-
- dfs
192-
193-
**Code(Python)**
194-
```Python
195-
m, n = list(map(int, input().strip().split(',')))
196-
197-
book = []
198-
for i in range(m):
199-
line = input().strip().split(',')
200-
line = [int(x) for x in line]
201-
book.append(line)
202-
203-
class Solution:
204-
def __init__(self, pos):
205-
self.pos = pos
206-
self.cnt = 0
207-
self.dp = []
208-
209-
def dfs(self, i, j):
210-
if 0 <= i < m and 0 <= j < n:
211-
if self.pos[i][j] == 1:
212-
self.cnt += 1
213-
self.pos[i][j] = 0
214-
self.dfs(i - 1, j)
215-
self.dfs(i + 1, j)
216-
self.dfs(i, j - 1)
217-
self.dfs(i, j + 1)
218-
self.dfs(i - 1, j - 1)
219-
self.dfs(i + 1, j + 1)
220-
self.dfs(i + 1, j - 1)
221-
self.dfs(i - 1, j + 1)
222-
return
223-
224-
def solve(self):
225-
for i in range(m):
226-
for j in range(n):
227-
if self.pos[i][j] == 1:
228-
self.cnt = 0
229-
self.dfs(i, j)
230-
if self.cnt > 0:
231-
self.dp.append(self.cnt)
232-
return len(self.dp), max(self.dp)
233-
234-
so = Solution(book)
235-
ret = so.solve()
236-
print(str(ret[0]) + ',' + str(ret[1]))
237-
```
238-
239-
### 2. 文章病句标识
240-
<div align="center"><img src="../assets/TIM截图20180812100344.png" height="" /></div>
241-
<div align="center"><img src="../assets/TIM截图20180812100356.png" height="" /></div>
242-
243-
**Code(Python)**
244-
```Python
245-
m = int(input())
246-
247-
tmp = []
248-
for _ in range(m):
249-
_line = input().strip().split(';')
250-
line = [list(map(int, be.split(','))) for be in _line]
251-
tmp.extend(line)
252-
253-
tmp = sorted(tmp, key=lambda x: x[0])
254-
255-
ret = [tmp[0]]
256-
for item in tmp[1:]:
257-
if ret[-1][1] >= item[0]:
258-
ret[-1][1] = max(ret[-1][1], item[1])
259-
else:
260-
ret.append(item)
261-
262-
s = ''
263-
for item in ret[:-1]:
264-
s += str(item[0])+','+str(item[1])+';'
265-
s += str(ret[-1][0])+','+str(ret[-1][1])
266-
print(s)
267-
```
268-
269-
### 3. 积分卡牌游戏
270-
<div align="center"><img src="../assets/TIM截图20180812100416.png" height="" /></div>
271-
<div align="center"><img src="../assets/TIM截图20180812100436.png" height="" /></div>
272-
273-
### 4. 区间最大最小值
274-
<div align="center"><img src="../assets/TIM截图20180812100503.png" height="" /></div>
275-
<div align="center"><img src="../assets/TIM截图20180812100524.png" height="" /></div>
276-
277-
### 5. 直播爱好者
278-
<div align="center"><img src="../assets/TIM截图20180812100550.png" height="" /></div>
279-
<div align="center"><img src="../assets/TIM截图20180812100606.png" height="" /></div>
280-
<div align="center"><img src="../assets/TIM截图20180812100617.png" height="" /></div>
Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
笔试-字节跳动-180812
2+
===
3+
共 5 道编程题
4+
5+
Reference
6+
---
7+
- [官方题解](https://m.toutiao.com/i6589920344075665928/?wxshare_count=2&pbid=6587230296797464068)(只有思路)
8+
9+
Index
10+
---
11+
<!-- TOC -->
12+
13+
- [1. 世界杯开幕式](#1-世界杯开幕式)
14+
- [2. 文章病句标识](#2-文章病句标识)
15+
- [3. 积分卡牌游戏](#3-积分卡牌游戏)
16+
- [4. 区间最大最小值 TODO](#4-区间最大最小值-todo)
17+
- [5. 直播爱好者](#5-直播爱好者)
18+
19+
<!-- /TOC -->
20+
21+
## 1. 世界杯开幕式
22+
<div align="center"><img src="../assets/TIM截图20180812100103.png" height="" /></div>
23+
<div align="center"><img src="../assets/TIM截图20180812100122.png" height="" /></div>
24+
25+
**思路**
26+
- dfs 搜索联通区域
27+
- 原题只要搜索 4 个方向,这里改为搜索 8 个方向
28+
29+
**Code(Python)**
30+
```Python
31+
M, N = list(map(int, input().split(',')))
32+
33+
book = []
34+
for i in range(M):
35+
line = list(map(int, input().split(',')))
36+
book.append(line)
37+
38+
39+
class Solution:
40+
def __init__(self, pos):
41+
self.pos = pos
42+
self.cnt = 0 # 记录当前区域的人数
43+
self.dp = [] # 保存所有区域的人数,返回其长度,及其中的最大值
44+
45+
def dfs(self, i, j):
46+
if 0 <= i < M and 0 <= j < N:
47+
if self.pos[i][j] == 1:
48+
self.cnt += 1
49+
self.pos[i][j] = 0 # 遍历过的点就置 0,避免重复搜索
50+
# 八个方向搜索
51+
self.dfs(i - 1, j)
52+
self.dfs(i + 1, j)
53+
self.dfs(i, j - 1)
54+
self.dfs(i, j + 1)
55+
self.dfs(i - 1, j - 1)
56+
self.dfs(i + 1, j + 1)
57+
self.dfs(i + 1, j - 1)
58+
self.dfs(i - 1, j + 1)
59+
60+
def solve(self):
61+
for i in range(M):
62+
for j in range(N):
63+
if self.pos[i][j] == 1:
64+
self.cnt = 0 # 每新找到一个区域就清零人数,重新计数
65+
self.dfs(i, j) # 深度优先搜索每个点
66+
if self.cnt > 0:
67+
self.dp.append(self.cnt)
68+
return len(self.dp), max(self.dp)
69+
70+
71+
s = Solution(book)
72+
P, Q = s.solve()
73+
print(str(P) + ',' + str(Q))
74+
```
75+
76+
## 2. 文章病句标识
77+
<div align="center"><img src="../assets/TIM截图20180812100344.png" height="" /></div>
78+
<div align="center"><img src="../assets/TIM截图20180812100356.png" height="" /></div>
79+
80+
**思路**
81+
- 区间合并
82+
- 排序 + 贪心
83+
```
84+
对 [l1,r1], [l2,r2],如果 r1 > l2,则 r1 = max(r1, r2)
85+
```
86+
87+
**Code(Python)**
88+
```Python
89+
# 输入处理
90+
m = int(input())
91+
92+
tmp = []
93+
for _ in range(m):
94+
line = [list(map(int, item.split(','))) for item in input().split(';')]
95+
tmp.extend(line) # 将所有病句存在一起
96+
97+
# 排序,按每段病句 [l, r] 的第一个位置 l 排序
98+
tmp = sorted(tmp, key=lambda x: x[0])
99+
100+
ret = [tmp[0]]
101+
for item in tmp[1:]:
102+
if ret[-1][1] >= item[0]: # 贪心:对 [l1,r1], [l2,r2],如果 r1 > l2,则 r1 = max(r1, r2)
103+
ret[-1][1] = max(ret[-1][1], item[1])
104+
else:
105+
ret.append(item)
106+
107+
# 输出处理
108+
s = ''
109+
for item in ret[:-1]:
110+
s += str(item[0]) + ',' + str(item[1]) + ';'
111+
s += str(ret[-1][0]) + ',' + str(ret[-1][1])
112+
print(s)
113+
```
114+
115+
## 3. 积分卡牌游戏
116+
<div align="center"><img src="../assets/TIM截图20180812100416.png" height="" /></div>
117+
<div align="center"><img src="../assets/TIM截图20180812100436.png" height="" /></div>
118+
119+
**思路**
120+
- 动态规划
121+
- **DP 定义**`d[i][j]​ := 前 i 张牌,两人所选择的牌的差值为 j 时的最大值`
122+
- **转移方程**
123+
```
124+
​d[i][j] = max(d[i-1][j], d[i-1][j-x[i]] + y[i], d[i-1][j+x[i]] + y[i])​
125+
```
126+
127+
**Code**(90%)
128+
```Python
129+
# 输入处理
130+
n = int(input())
131+
x, y = [], []
132+
for i in range(n):
133+
_x, _y = list(map(int, input().split()))
134+
x.append(_x)
135+
y.append(_y)
136+
137+
xy = list(zip(x, y))
138+
xy = sorted(xy, key=lambda t: t[1])
139+
140+
ret = 0
141+
if sum(x) % 2 == 0: # 如果所有 x 的和为偶数
142+
print(sum(y)) # 直接输出所有 y 的和
143+
else:
144+
for i in range(len(xy)):
145+
if xy[i][0] % 2 == 1: # 去掉 x 中为奇数的那一项
146+
ret = sum([xy[j][1] for j in range(len(xy)) if j != i])
147+
print(ret)
148+
break
149+
```
150+
- 这段代码能过 90% 真是运气
151+
152+
## 4. 区间最大最小值 TODO
153+
<div align="center"><img src="../assets/TIM截图20180812100503.png" height="" /></div>
154+
<div align="center"><img src="../assets/TIM截图20180812100524.png" height="" /></div>
155+
156+
## 5. 直播爱好者
157+
<div align="center"><img src="../assets/TIM截图20180812100550.png" height="" /></div>
158+
<div align="center"><img src="../assets/TIM截图20180812100606.png" height="" /></div>
159+
<div align="center"><img src="../assets/TIM截图20180812100617.png" height="" /></div>
160+
161+
**思路**
162+
- 贪心选择结束时间最早的直播
163+
164+
**Code**: 未测试
165+
```C++
166+
#include<bits/stdc++.h>
167+
using namespace std;
168+
169+
int main() {
170+
int n, m;
171+
cin >> n >> m;
172+
173+
vector<pair<int, int>> book;
174+
for(int i=0; i<n; i++){
175+
int l, r;
176+
scanf("%d%d", &l, &r);
177+
if(l > r) // 坑点:可能存在第二天的情况
178+
r += m;
179+
book.push_back({r, l}); // 把结束时间存在首位,排序时避免重新定义比较方法
180+
}
181+
182+
sort(book.begin(), book.end()); // 按结束时间排序
183+
184+
int ret = 0;
185+
int r = 0; // 保存当前结束时间
186+
for (int i=0; i<n; i++) {
187+
if (book[i].second > m) // 只能在当天看完
188+
continue;
189+
if (r < book[i].second) { // 如果当前直播在上一个直播结束之后开始
190+
ret += 1;
191+
r = book[i].first; // 更新结束时间
192+
}
193+
}
194+
195+
cout << ret << endl;
196+
return 0;
197+
}
198+
```
199+
> 《挑战程序设计(第二版)》 2.2.2 区间问题
200+

0 commit comments

Comments
 (0)