中级农民
- 积分
- 239
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2018-2-8
- 最后登录
- 1970-1-1
|
203. Remove Linked List Elements
3. Longest Substring Without Repeating Characters
490. The Maze
505. The Maze II
lintcode 819. Word Sorting
两道面经题加无处安放的代码
//第一个把下面的格式的字符串变成树:node有键,值和子树。比如第一个的键是node1,值是‘aaaa'
// <node1>aaaaa<node2>bbbbb<node5>csdfds</node5><node6>ddsdfdd</node6></node2><node3>cccc</node3><node4>dddd</node4></node1>
public TreeNode solve(String s) {
if (s == null || s.length() == 0) return null;
Deque<TreeNode> stack = new LinkedList<>();
char[] array = s.toCharArray();
int i = 0;
while(i < array.length) {
i = s.indexOf('<', i);
if (i == -1) break;
i++;
if (array[i] == '/') { //end of a node
TreeNode cur = stack.pop();
i = s.indexOf('>', i);
if(!stack.isEmpty()) {
TreeNode parent = stack.peek();
parent.children.add(cur);
} else stack.push(cur);
} else { //deal with node name
int key_end = s.indexOf('>', i);
String key = s.substring(i,key_end);
i = key_end +1;
int val_end = s.indexOf('<', i);
String val = s.substring(i, val_end);
TreeNode cur = new TreeNode(key, val);
stack.push(cur);
}
}
return stack.peek();
}
class TreeNode {
String key;
String val;
List<TreeNode> children;
public TreeNode(String key, String val) {
this.val = val;
this.key = key;
children = new ArrayList<>();
}
}
字符串自然顺序比较,被提醒了各种corner case a12和a9相比a9更小。a12和b9相比a12更小 a4b2 < a3c1
private void update(String s, int[] pairs) {
pairs[2] = 0;
if (pairs[0] >= s.length()) {
pairs[0]++;
return;
}
pairs[1] = s.charAt(pairs[0]);
pairs[0]++;
if(!Character.isDigit(s.charAt(pairs[0]))) pairs[2] = 1;
else {
while(pairs[0] < s.length() && Character.isDigit(s.charAt(pairs[0]))) {
pairs[2]= pairs[2] * 10 + s.charAt(pairs[0])-'0';
pairs[0]++;
}
}
}
public int compare(String s1, String s2) {
if (s1.equals(s2)) return 0;
int[] pairs_s1 = new int[]{0, 0, 0}; //pairs_s1 index char digit
int[] pairs_s2 = new int[]{0, 0, 0};
while (pairs_s1[0] <= s1.length() && pairs_s2[0]<= s2.length()) {
if (pairs_s1[1] != pairs_s2[1]) return pairs_s1[1] - pairs_s2[1];
if (pairs_s1[2] == pairs_s2[2]) {
update(s1, pairs_s1);
update(s2, pairs_s2);
} else if (pairs_s1[2] < pairs_s2[2]) {
update(s1, pairs_s1);
pairs_s2[2] = pairs_s2[2]-pairs_s1[2];
} else {
update(s2, pairs_s2);
pairs_s1[2] = pairs_s1[2]-pairs_s2[2];
}
}
if (pairs_s1[2] == 0 && pairs_s2[2] == 0) return 0;
return pairs_s1[2] == 0? -1:1;
} |
|