String
String本身不难,主要它作为可读编码,需要各种转换
单个计算的
-
转换为Hex,Integer,Array,特别是LeadingZero的定义可能不同: 这种问题说实话就是拼手速与用例,一般是Easy与Middle的难度。比如https://leetcode.com/problems/string-to-integer-atoi/
-
作为Tokenizer的输入源,实现简易的Inteceptor/Decoder,需要通过PatternMatch维护状态机(最简单的boolean到较为复杂的枚举),不同嵌套级别的ContextScope(比如Stack/Map),这个王垠比较在行
eg: https://leetcode.com/problems/decode-string/
需要对比的
- 与Regex混用(Greedy/DP)需要掌握表达式,比如 https://leetcode.com/problems/valid-parenthesis-string/,Kleene closure
- Elastic搜索相关,比如编辑距离,共同拥有的某个特点,倒排索引,NGram等
Substing类型
- 排列组合,比如不能连续N个值,很容易转为数组类问题,滑动窗口等
常见问题
- StringBuilder一个个append性能不如subString()
- 不熟悉的业务,不要上来就抽象出公共method
常见方法
// avoid for loop
String.join("|",Collections.emptyList());
// clear stringBuilder cache
sb.setLength(0);
// str <--> number
int n = 0;
for(int i = 0; i< s.length();i++){
char c = s.charAt(i);
if(Character.isDigit(c)){
n = n*10 + c - '0';
}
}
// or Integer.valueOf(str)
// char <--> string
Character.toString('c');
"aaa".toCharArray();
// 高性能StringBuilder,用于冲top1 然而这里一般不是瓶颈,一般也就是8ms的差距
char[] arr = new char[SIZE];
int size = 0;
new String(Arrays.copyOfRange(sb,0,size));// size is excluded.