Java的语法小结:
- 遍历Hash Map
直接遍历key:
for(Character key : mp.keySet()){
Value next = it.get(key);
}
HashMap<Integer, Integer> mp = new HashMap<Integer, Integer>();
for(Map.Entry<Integer, Integer> it : mp.entrySet()){
it.getKey();
it.getValue();
}
}
- 遍历HashSet:
Iterator iter = set.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
- Queue的使用
Java中Queue是interface。可以用linkedlist实现,方法有:
Q.offer(); Q.poll(); Q.size(); Q.peek() (Empty 用 Q.size() > 0 来实现)。另外注意,BFS中c++的pair<int, int> 在java中用二维数组来实现
Queue<int[]> = new LinkedList<>();
q.offer(new int[]{i, j});
int[] top = q.poll();
int[][] directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
if(root==null) return result;
Queue<TreeNode> q = new LinkedList<>();
q.add(root);
while(q.size()>0){
List<Integer> list = new ArrayList<>();
int size = q.size();
for(int i=0; i<size; i++){
TreeNode node = q.poll();
list.add(node.val);
if(node.left!=null) q.add(node.left);
if(node.right!=null) q.add(node.right);
}
result.add(list);
}
return result;
}
- Stack的使用:
Stack<TreeNode> stack = new Stack<>();
stack.pop();
stack.peek() -> this is top
stack.empty();
stack.push();
- List and ArrayList;
List is interface, 在赋予ArrayList时,后面不用给出具体类型。
List<List<Integer>> ret = new ArrayList<>();
myLst.toArray(new int[people.length][]); // ArrayList.toArray()
ret.get(i) // access index i
在Backtracking时,记住要将comb copy一份,再添加到allcomb中去。否则传入的仅仅是comb的指针而已,这样comb变化时,allcomb的值也跟着变了。
if(k == 0 && n == 0){
List<Integer> temp = new ArrayList<>(comb);
allcomb.add(temp);
return;
}
自定义comparator:
Arrays.sort(cur, new Comparator<String>(){
public int compare(String a, String b){
return (s2+s1).compareTo(s1+s2);
}
});
一般: a-b 表示由低到高,b-a表示有高到低,a.compareTo(b) 表示由低到高,b.compareTo(a) 表示有高到低
Queue<Node> queue = new PriorityQueue<Node>(k, new Comparator<Node>() {
public int compare(Node o1, Node o2) {
if (o1.value > o2.value)
return -1;
else if (o1.value < o2.value)
return 1;
else
return 0;
}
});
// Priority Queue 可以如下定义:
PriorityQueue<Integer> pq = new PriorityQueue<>((x,y) -> y-x); // maxheap
PriorityQueue<Integer> pq = new PriorityQueue<>((x,y) -> x-y);
String to Int: Integer.parseInt(s);
- Java 的 Deque
Deque<string> dq = new ArrayDeque<>();
dq.push(); -> c++ 中的push_back();
dq.pollFirst() -> c++ 中的pop_back();
dq.pollLast() -> c++ 中的 pop_front();
dq.peekFirst() -> c++ 中的 back();
dq.peekLast() -> c++ 中的 front();
dq.offer() || dq.add() -> c++ 中的push_front()
7, StringBuilder,
Java 在处理string时要相对方便一些,比如split:直接调用string.split('/') 即可。
for(String token : path.split('/')){}
StringBuilder 引入了 c++中string的一些功能:
StringBuilder 也有length(), charAt(), 处理时和String一样。也还有
append() - 可以append 任何type
deleteCharAt() - 删除一个char
toString()
setCharAt() -> 变换一个char
while(sb.length() > 1 && sb.charAt(0) == '0') sb.deleteCharAt(0);
- String:
string与string builder异曲同工,java string记住有下面的便利function:string.split("a"), string.findIndexOf(), string.IndexOf(), string.lastIndexOf(). String Builder 也有这些函数
其它:
Character.isDigit(s.charAt(i)) -> isDigit;
public class Solution {
public int numIslands(char[][] grid) {
if(grid == null || grid.length == 0 || grid[0].length == 0) return 0;
int row = grid.length, col = grid[0].length;
boolean[][] visited = new boolean[row][col];
int cnt = 0;
int[][] directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
for(int i=0; i<row; i++){
for(int j=0; j<col; j++){
if(grid[i][j] == '1' && !visited[i][j]){
cnt++;
visited[i][j] = true;
Queue<int[]> q = new LinkedList<>();
q.offer(new int[]{i, j});
while(q.size() > 0){
int[] cur = q.poll();
for(int[] it : directions){
int x = cur[0] + it[0], y = cur[1] + it[1];
if(x < 0 || x >= row || y < 0 || y >= col) continue;
if(grid[x][y] == '1' && !visited[x][y]){
visited[x][y] = true;
q.offer(new int[]{x, y});
}
}
}
}
}
}
return cnt;
}
}