面试-腾讯-基础开发
一面
面试体验巨好,超级好,牛逼
- js题
- setTimeout
- 算法题
- sort 二分找最小
- 合并有序节点
- 查找第三大的节点
- java 多线程
- 生产者消费者
- js模块化
- electron
- 进程通信
- 开源项目
- 看了我的简历写的开源项目,问了一下
- 怎么编译kotlin到js
- 看了我的简历写的开源项目,问了一下
- Android
- Activity生命周期 ,应该是看到我简历有写,就简单问了一下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368// 45分钟
题目1(js基础): 阅读下面代码,写出结果
let data = { "a": 1, "b": 101 }
function read(readUseTime) {
return new Promise(resolve => {
setTimeout(() => {
resolve({...data})
}, readUseTime)
})
}
function write(value, writeUseTime) {
console.info('write ',value)
return new Promise(resolve => {
setTimeout(() => {
data = value
resolve()
}, writeUseTime)
})
}
async function readAndWrite(key, value, readUseTime = 0, writeUseTime = 0) {
let d = await read(readUseTime)
d[key] = value
await write(d, writeUseTime)
}
;(() => {
setTimeout(readAndWrite, 0, 'a', 2)
setTimeout(readAndWrite, 0, 'b', 102)
setTimeout(() => {
// 输出结果
console.log(data)
}, 1000)
})()
{ "a": 1, "b": 102 }
进一步问:必需输出的是 { "a": 2, "b": 102 },怎么修改function readAndWrite
var isdo = null
async function readAndWrite(key, value, readUseTime = 0, writeUseTime = 0) {
if (isdo != null)
await isdo;
isdo = new Promise(async (resolve,reject)=>{
let d = await read(readUseTime)
d[key] = value
resolve(d)
}).then((res)=> {
return new Promise(async (resolve, reject)=>{
await write(res, writeUseTime)
isdo = false
resolve()
})
})
}
var h = setTimeout(() => { h = null; }, 1000)
if (h == undefined) { }
isdo = new Promise
;(() => {
setTimeout(readAndWrite, 0, 'a', 2)
setTimeout(readAndWrite, 0, 'b', 102)
setTimeout(() => {
// 输出结果
console.log(data)
}, 1000)
})()
题目2(算法):合并两个从小到大链表的链表,使用的算法越快越好。
比如:L1={1,3,5}, L2={2,4}, L1.merge(L2)后,L1={1,2,3,4,5}, L2={}
class LinkNode {
private int val;
private LinkNode next;
public void merge(LinkNode node) {
// TODO 请完成实现部分
}
}
function LinkNode () {
this.val = 0;
this.next = null
this.merge = function (node) {
let head = new LinkNode()
let res = head
let l1 = node
let l2 = this
//if
while(l1 != null || l2 != null) {
let nex
if (l1.val < l2.val) {
res.insert(l1)
l1 = l1.next
res = res.next
} else if (l1.val > l2.val) {
res.insert(l2)
l2 = l2.next
res = res.next
}
}
if (l1 != null) {
res = l1
} else {
res = l2
}
this.next = head.next
this.val = head.val
}
this.insert = function (node) {
let nex = this.next
// let nodex = node.next
this.next = node
node.next = nex
// node = nodex
}
}
//bu yong new node
function LinkNode () {
this.val = 0;
this.next = null
this.merge = function (node) {
let res = null
let l1 = node
let l2 = this
let head = l1.val <= l2.val? l1:l2
res = head
//if
if(head.val == l1.val) l1 = l1.next
else l2 = l2.next
while(l1 != null || l2 != null) {
if (l1.val < l2.val) {
l1.insert(l2)
l1 = l1.next
} else if (l1.val > l2.val) {
l2 = l2.next
}
}
if (l1 != null) {
res = l1
} else {
res = l2
}
}
this.insert = function (node) {
let nex = this.next
// let nodex = node.next
this.next = node
node.next = nex
// node = nodex
}
}
题目3(算法):给定一个递增循环整数数组,从里面找出最小的元素,使用的算法越快越好。特别地,最小的元素可能出现在数组中间。比如:50, 52, 63, 90, 3, 8, 15, 44。
class Problem2 {
int findmin(int[] array) {
// TODO 请完成实现部分
}
}
var findMin = function (arr) {
return arr.sort((b,a) => b-a)[0]
}
var findMin = function (arr ) {
let l =0
let m = parseInt(arr.length/2)
let r = arr.length-1
if (arr.length==2) return Math.min(arr[0],arr[1])
if (arr.length==1) return arr[0]
console.info(arr)
if (arr[l] <= arr[m]){
return Math.min(arr[l],findMin(arr.slice(m+1)))
}else {
return Math.min(arr[m],findMin(arr.slice(0,m)))
}
}
题目4(算法):在二叉排序树上面找出第3大的节点。注意:不能把二叉树全量存储到另外的存储空间,比如存储到数组中,然后取出数组的第三个元素。
class TreeNode {
int value;
TreeNode left, right;
};
class Problem3 {
TreeNode find(TreeNode root) {
// TODO 请完成实现部分
}
}
var res = []
var find = function (root) {
findMax(root)
return res[0]
}
var add = function add(arr, v) {
if (arr.length >2) {
arr[0] = arr[1]
arr[1] = arr[2]
arr[2] = v
}
else {
arr.push(v)
}
return arr
}
var finMax = function (root) {
if (root.left != null) {
res = add(res,root.left.value)
}
res = add(res,root.value)
if (root.right != null) {
return findMax(root.right)
}
}
题目5(java多线程):阅读下面代码,在2线程环境下,设计一个方案,判断无限数据流(Stream)每个正整数是否素数,越快越好
interface Stream {
long get(); // 获取下一个需判断的整数
void put(boolean result); // 返回整数是否素数的结果
static boolean isPrimeNumber(long num) { // 判断一个整数是否素数
if (num < 2) return false;
for (long i = 2, s = (long) Math.sqrt(num); i <= s; i++) {
if (num % i == 0) return false;
}
return true;
}
static Stream getInstance() {
try {
return (Stream) Class.forName("StreamImpl").newInstance(); // 运行环境保证不会异常
} catch (Exception e) {
return null;
}
}
}
比如:Stream={1,2,3,4,...}, Result={false,true,true,false,...},注意输出顺序。
public class Problem5 {
private Stream stream = Stream.getInstance();
private long t1;
public void thread1() throws InterruptedException {
assert Thread.currentThread().getName() == "thread1";
// TODO 请完成实现部分
long t = stream.get()
boolean b = Stream.isPrimeNumber(t)
stream.notify()
t1
stream.put(
)
stream.wait();
}
public void thread2() throws InterruptedException {
assert Thread.currentThread().getName() == "thread2";
long t = stream.get()
boolean b = Stream.isPrimeNumber(t)
stream.wait();
stream.put(
Stream.isPrimeNumber(stream.get())
)
stream.notify()
}
// TODO 请完成实现部分
public static void main(String[] args) {
Problem5 p5 = new Problem5()
new Thread(new Runnable() {
@Override
void run() {
try {
p5.thread1();
} catch (Exception e) {
}
},"thread1").start();
new Thread(new Runnable() {
@Override
void run() {
try {
p5.thread2();
} catch (Exception e) {
}
},"thread2").start();
}
}
js基础:js模块化有哪些
引用js模块
require
require('xxx.js')
import A from 'hjk.js'
import AC from 'jjj.vue'
一个得到的是引用
一个得到的是一个对象
import 大部分时候通过 babel 实现
node不支持直接使用import
为了支持es6 有一个新的js运行环境 deno ?
electron基础:Main进程,Renderer进程如何通信
ipcMain
ipcMain.on('xxx-event',(event,arg) =>{
//do some
event.sender.send('')
}
ipcRender.send
-- remote
build.gradle
task complieJs (type: Exec, group: 'custom') {
workingDir '.'
commandLine 'kotlinc-js', '-output', 'node-publish/lib/kfmd.js' , "build/source", '-module-kind', 'commonjs'
}
// A problem occurred starting process 'command 'kotlinc-js''
var core = kfmd.Core()
var html = core.setContainorClass('demo').trans(a)
Android
- Activity生命周期 ,应该是看到我简历有写,就简单问了一下
二面 2020/03/30 8:30
- 项目
- 概率题
- 老鼠吃药二进制
- 打乱扑克牌