360面试总结

1.傻吊自增操作

i= 0;
1. i = i++;
2. b = i++ + i++;

要明白这两条傻逼语句的结果, 首先要明白->自增操作iinc直接操作本地变量表
eg iinc 1,1 将index 1的位置变量 + 1; iinc应该是针对add操作的优化

i++的语义为先将i参与运算, 再将i+1; 这里的”运算”比较特殊, 举例如下:
(i = i)(++), 赋值是一个”运算”, 自增是一个”运算”, i先加入赋值运算中, 再进行自增运算; 编译成字节码为load-> iinc -> store, 结果值为0


b = i++ + i++, 这里加法是一个运算, load_i将i加入到加法运算中(放到栈顶), 再自增. 编译成字节码为 load -> iinc -> load -> iinc -> add -> store, b值为1


b = i++ + ++i, 编译成字节码为 load -> iinc -> iinc -> load -> add -> store; b值为2

2. unboxing

Integer a = 0, b = 40;
b == b + a; // true

(1) 首先a = Integer.valueOf(0), 进行自动装箱.
(2) b + a 会自动拆箱, 转化为int值计算.
(3) int优先级高于boxing(或者说, 非常容易导致unboxing), 将b拆箱比较

Integer a = new Integer(0);
Integer b = new Integer(40);
b == b + a; // true

注意new Integer()内部不是调用valueOf()!!!
但是+还是存在拆箱

3. HTTP2.0

多路复用, 二进制分帧, ASCII码传输

4. 基因匹配

字符串只支持set, swap操作, 求最少操作次数
source: ATTTAA, target:TTAATT, res = 3;
目前只想到暴力大法:

public static int map(String source, String target) {
int res = 0;
int len = source.length();
StringBuilder sb = new StringBuilder(source);

for (int i = 0; i < len; i++) {
if (sb.charAt(i) == target.charAt(i)) continue;

boolean flag = false;
int j = i;
while (j < len && (sb.charAt(j) == sb.charAt(i) || sb.charAt(j) == target.charAt(j))) j++;
if (j != len) {
swap(sb, i, j);
} else {
假装set
}
res++;
}

return res;
}

5. 抽奖(不会)

n张中奖票, m张不中奖, A,B每次抽1张并看结果, B额外拿一张丢掉, 求A获胜率

2020-03-24 22:04 创建
2020-03-25 12:36 更新