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.