面试笔记:面经-腾讯-三面


一、自我介绍

个人背景、项目经历、实习经历。


二、移动端

2.1 React优势

  • 速度快
    React并不直接对DOM进行操作,引入了一个virtual DOM的概念,安插在JavaScript逻辑和实际的DOM之间,性能好。
  • 跨浏览器兼容
    virtual DOM帮助解决了跨浏览器问题,提供了标准化的API。
  • 组件化
    一切都是component,代码更加模块化,重用代码更容易,可维护性高。
  • 单向数据流
    Flux是一个用于在JavaScript应用中创建单向数据层的架构,它随着React视图库的开发而被Facebook概念化。
  • 同构、纯粹的javascript
    因为搜索引擎的爬虫程序依赖的是服务端响应而不是JavaScript的执行,预渲染应用有助于搜索引擎优化。
  • 兼容性好
    如使用RequireJS来加载和打包,而Browserify和Webpack适用于构建大型应用。使得艰难的任务不再让人望而生畏。

2.2 TCP流量控制

  • 流量控制
    即控制发送方发送速率。
    双方在通信的时候,发送方的速率与接收方的速率是不一定相等,如果发送方的发送速率太快,会导致接收方处理不过来,这时候接收方只能把处理不过来的数据存在缓存区里(失序的数据包也会被存放在缓存区里)。如果缓存区满了发送方还在疯狂着发送数据,接收方只能把收到的数据包丢掉,大量的丢包会极大着浪费网络资源。因此需要控制发送方的发送速率,让接收方与发送方处于一种动态平衡。
  • 如何控制
    接收方每次收到数据包,可以在发送ACK的时候,同时告诉发送方自己的缓存区还剩余多少是空闲的,剩余大小称之为接收窗口大小,用变量win来表示接收窗口的大小。
    发送方收到之后调整自己的发送速率,也就是调整自己发送窗口的大小,当发送方收到win=0时,发送方就会停止发送数据,防止出现大量丢包情况的发生。
  • 何时再继续发送数据
    策略:当接收方处理好数据,接受窗口win>0时,接收方发个通知报文去通知发送方,告诉他可以继续发送数据了。当发送方收到win>0的报文时,就继续发送数据。
    但是假如这个报文丢失就会引发一个问题:接收方发了通知报文后,继续等待发送方发送数据,而发送方则在等待接收方的通知报文,双方会陷入一种僵局。
    为了解决这种问题,采用了另外一种策略:当发送方收到接受窗口win=0时,这时发送方停止发送报文,并且同时开启一个定时器,每隔一段时间就发个测试报文去询问接收方是否可以继续发送数据了,如果可以,接收方就告诉他此时接受窗口的大小;如果接受窗口大小还是为0,则发送方再次刷新启动定时器。

2.3 图片格式jpg、gif、png

  • JPG:支持颜色多,图片可压缩,不支持透明,通常用来保存照片等颜色丰富的图片。
  • GIF:支持颜色少,支持简单透明,支持动态图,通常用在颜色单一或者要求动态图的图片上。
  • PNG:支持颜色多,支持复杂透明,一般用来显示颜色复杂且要求透明的图片。

2.4 登录界面的实现

2.5 前端和后端的通信

  • 通过GET提交数据。
  • 通过POST提交数据。
  • 使用第三方AsyncHttpClient提交数据。

三、推理题

一个商人骑一头驴要穿过1000公里的沙漠,去卖3000根萝卜。已知驴一次可驮1000根萝卜,但每走一公里又要吃掉一根萝卜。
:商人一共可以卖出多少根萝卜?

:商人卖得最多等价于驴吃得少,等价于驴走了最短的路程。
驴每走1公里吃1根胡萝卜,所以尽量让驴背上的胡萝卜保持最多,最后剩下的胡萝卜也就最多;而让驴驮最多就需要每段出发时驴背上都满载(1000根),一次背1000根,3000/1000=3,因此需要把路分成3段,中间有两个停靠点。
假设第一个停靠点为A,从起点驮3000根胡萝卜到A点,驴要来回5趟(第一次1000,回去;第二次1000,回去;第三次1000,不用回去)。第一个整倍数是2000,也就是说将胡萝卜都运到A点时,胡萝卜总数要为2000根。所以A点为走5次吃掉1000个胡萝卜的地方,即1000/5=200公里处。
假设第二个停靠点为B,2000个胡萝卜从A到B要来回3次,同样的道理,B点要设在距离A点1000/3=333.3公里的地方。
因此驴从B点往目的地出发时还剩下1000跟胡萝卜,距离为800-333=467公里,因此到目的地后还剩下1000-467=533根。


四、算法题

小Q有n个数字,每次小Q选择任意两个不相同数字,并同时删去他们,最后能不能删完。

输入描述
第一行数字T,表示数据组数,对于每组数据,第一行一个数字N,表示数字个数,N一定是偶数,接下来一行N个数Ai,表示这些数字,满足2<=N<=1000000,1<=Ai<=N。

输出描述
对于每一组数据,输出YES或者NO表示是否可以删除所有的数字。

输入
1
6
1 2 3 4 5 6
输出
YES

输入
1
4
4 4 4 3
输出
NO

思路一:将所有数存入map,按value降序排序,将前两个的value-1,再排序,重复该步骤,当前两个value为0时,则删完。
思路二:只要出现次数最多的那一个数的出现次数小于等于一半就是YES,否则NO。

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        for (int i = 0; i < t; i++) {
            int n = sc.nextInt();
            HashMap<Integer, Integer> map = new HashMap<>();
            for (int j = 0; j < n; j++) {
                int key = sc.nextInt();
                int value = !map.containsKey(key) ? 1 : map.get(key) + 1;
                map.put(key, value);
            }
            int max = Integer.MIN_VALUE;
            for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
                if (entry.getValue() > max) {
                    max = entry.getValue();
                }
            }
            if (max <= n / 2) {
                System.out.println("YES");
            } else {
                System.out.println("NO");
            }
        }
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值