问题了一些java基础,项目,还有日常编写代码的方式.八股基本没有是比较舒服的一次面试.
收获
自己表述能力差,项目表达是弱项,然后因为之前经验都是小公司好像,大家对我的项目也不怎么感兴趣,业务经验上我的优点电商经验有一些算是一个点,项目亮点我觉得通过dts做数据同步的算唯一亮点了吧.之后应该把这部分总结一下.
英语比较差以至于离开了idea,居然Calendar没说出来..
说线程池参数的时候,少说了核心线程数(最小),和空闲时间(keepAliveTime),今年也就写了5次,确实有点忘了,只有写的时候记得住.这不是重点,重点之前写了一个多线程消费的模板代码,其实这是面试陌陌的时候问的一个问题,这个问题的答案其实大家都知道,就是通过hash使同id的消息,在同一个线程上执行来保证消息顺序,我写的代码站在这个角度来看其实就是一个自带task分配策略的简单的线程池,没有最小线程数意味着我一开始,就启动了所有线程造成了不必要的资源浪费,我应该看一下线程池的代码,应该会暴露task分配方法或者接口,这样就可以继承原生线程池对,资源的管理和回收,是更好的写法.之后写一下.
然后问了下我的一篇关于库存.里面的一个错误的点,就是在默认的mysql默认的rr隔离级别下,update语句是加锁的,所以是串行执行的,当乐观锁条件正确的时候,是不会出现并发错误的.
算法题
public class test13 {
public Set<String> distinctSpecialString(List<String> specialStringList) {
Set<String> result = new HashSet<>();
Map<String, String> map = new HashMap<>();
for (String str : specialStringList) {
String normalString = this.normalString(str);
if (!map.containsKey(normalString)) {
map.put(normalString, str);
result.add(str);
}
}
return result;
}
//使顺序不同的字符串相等
private String normalString(String str) {
String[] strs = str.split("_");
Arrays.sort(strs);
return String.join("_", strs);
}
public List<String> normalizeString(String str) {
List<String> parts = new ArrayList<>();
int index = 0;
StringBuilder sb = new StringBuilder();
while (index < str.length()) {
char c = str.charAt(index);
if (c == '_') {
parts.add(sb.toString());
//清空StringBuilder
sb.setLength(0);
} else if (c == '\\') {
sb.append(c);
char nextChar = str.charAt(index + 1);
if (nextChar == '_') {
// 跳过转义的下划线或斜杠
sb.append(nextChar);
index++;
}
} else {
sb.append(c);
}
index++;
}
parts.add(sb.toString());
//对parts进行排序并重新连接成标准化字符串
Collections.sort(parts);
return parts;
}
public static void main(String[] args) {
List<String> specialStringList = Arrays.asList(
"123_456_abc",
"456_abc_123",
"123_4_56_abc",
"456_123_789",
"789_123_456",
"123_456\\_abc",
"abc_456\\_123"
);
test13 processor = new test13();
List<String> strings = processor.normalizeString(specialStringList.get(specialStringList.size() - 1));
System.out.println(strings);
}
}
根据ascii使子串相同但顺序不同的字符串排序后一致,然后去重.附加题需要判断\_,由于一开始思路错了没写完.
public class test12 {
public boolean test(String s) {
Deque<Character> stack = new ArrayDeque<>();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(' || s.charAt(i) == '[' || s.charAt(i) == '{') {
stack.add(s.charAt(i));
} else {
char c = stack.peek();
if (c == '(' && s.charAt(i) == ')') {
stack.pop();
} else if (c == '[' && s.charAt(i) == ']') {
stack.pop();
} else if (c == '{' && s.charAt(i) == '}') {
stack.pop();
} else {
return false;
}
}
}
return stack.isEmpty();
}
public static void main(String[] args) {
test12 test12 = new test12();
String s = "()[]{}";
boolean t1 = test12.test(s);
System.out.println(t1);
for (int i = 0; i < s.length(); i++) {
System.out.println(s.charAt(i));
}
}
}
标准的括号匹配题,但是由于一开始想用Deque双端队列模拟栈,脑子一抽写错了,写成了Dueue,然后小紧张一下,死活写不出来了,面试官提醒了一下改成Stack<T>了.但是一开始的想法还是Deque<T>,因为stack性能比较差,leetcode上几乎没人用.
ps:没有白板经验,写起来真的很费劲.好讨厌白板编程啊啊啊啊啊.让我回想起了学生时代,老师让我在纸上写代码的痛苦回忆