面试-腾讯-基础开发

面试-腾讯-基础开发

一面

面试体验巨好,超级好,牛逼

  • 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

二面 2020/03/30 8:30

  • 项目
  • 概率题
  • 老鼠吃药二进制
  • 打乱扑克牌
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2020 Kfdykme
  • Powered by Hexo Theme Ayer
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信