蘑菇街面试总结
关于有重复的二分查找
当时面试官说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
50package 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定时会根据数据库的binlog日志解析对应数据的变化,然后对redis数据进行统一化
redis和memcached的区别
- Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储;
- 关于过期时间,memcached刚开始就必须设置过期时间,而redis可以通过expire设置过期时间
- Redis支持数据的备份,即master-slave模式的数据备份;
- 存储数据安全–memcache挂掉后,数据没了;redis可以定期保存到磁盘(持久化);
关于购物车过期
当时的考虑不够周全,所以我打算把github上项目更改,其实使用定时器就可以解决。
个人总结
希望面试官可以青睐我,我会继续努力!
我的个人网站 www.lmxljc.xyz