茂展的分享博客

蘑菇街二面

蘑菇街面试总结

关于有重复的二分查找

当时面试官说10分钟写出来,因为编译器启动了差不多四分钟,所以很紧张,结果没有回答好,现在结束了 自己写了一下

思路:

首先二分查找就是有序的二分查找,然后如果出现重复的话,首先我会先在碰到相等的元素后,然后判断左右是否第一个是否相等,如果相等,就继续遍历,直到遇到左边或者右边不相等的元素,就循环Break。
很简单的问题,哎

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
package com.nyist.sort;

import java.util.ArrayList;
import java.util.List;

public class FindByBinary {

public static void main(String[] args) {
Integer[] nums = {2,3,4,5,6,7,7,8,9};
List<Integer> list = findBinary(nums, 7);
for (Integer num : list) {
System.out.print(num+" ;");
}
}

private static List<Integer> findBinary(Integer[] nums, int searchKey) {
List<Integer> myRes = new ArrayList<Integer>();
int low = 0, high = nums.length - 1;
while (low <= high) {
int mid = (low + high) / 2;
if (nums[mid].equals(searchKey)) {
if (mid > 0) {
if (nums[mid - 1].equals(searchKey)) {
for (int i = mid - 1; i >= 0; i--) {
if (nums[i].equals(searchKey)) {
myRes.add(i);
} else break;
}
}
}
myRes.add(searchKey);
if (mid < high) {
if (nums[mid + 1].equals(searchKey)) {
for (int i = mid + 1; i <= high; i++) {
if (nums[i].equals(searchKey)) {
myRes.add(i);
} else break;
}
}
}
return myRes;
} else if (searchKey < nums[mid]) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return myRes;
}
}

关于redis和mysql数据的一致性

阿里的canal(使用binlog日志后续同步)

为了证明我之前就是用过,确实当出没有反应出来,去我的github上截取一下时间
数据统一canal
canal原理就是借助于数据库更新后,然后canal定时会根据数据库的binlog日志解析对应数据的变化,然后对redis数据进行统一化

redis和memcached的区别

  1. Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储;
  2. 关于过期时间,memcached刚开始就必须设置过期时间,而redis可以通过expire设置过期时间
  3. Redis支持数据的备份,即master-slave模式的数据备份;
  4. 存储数据安全–memcache挂掉后,数据没了;redis可以定期保存到磁盘(持久化);

关于购物车过期

当时的考虑不够周全,所以我打算把github上项目更改,其实使用定时器就可以解决。

个人总结

希望面试官可以青睐我,我会继续努力!
我的个人网站 www.lmxljc.xyz

------本文结束感谢阅读------
🐶 您的支持将鼓励我继续创作 🐶