统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。
请注意,你可以假定字符串里不包括任何不可打印的字符。
示例:
输入: "Hello, my name is John"
输出: 5
上期的问题是:198,N叉树的层序遍历
1private class Node {
2 public int val;
3 public List<Node> children;
4
5 public Node() {
6 }
7
8 public Node(int _val, List<Node> _children) {
9 val = _val;
10 children = _children;
11 }
12}
这是Node类,下面看一下算法
1public List<List<Integer>> levelOrder(Node root) {
2 List<List<Integer>> res = new ArrayList<>();
3 if (root == null) return res;
4 Queue<Node> q = new LinkedList<>();
5 q.offer(root);
6 while (!q.isEmpty()) {
7 int size = q.size();
8 List<Integer> level = new ArrayList<>();
9 for (int i = 0; i < size; i++) {
10 Node tmp = q.poll();
11 level.add(tmp.val);
12 q.addAll(tmp.children);
13 }
14 res.add(level);
15 }
16 return res;
17}
解析:
这题很好理解,因为这里是n叉树,到底有几个子节点我们不知道,但是在Node节点中统一把他们放到了children中。如果是二叉树的话我们看下代码怎么写
1 public List<List<Integer>> levelOrder(Node root) {//二叉树的遍历,不是这一题的。
2 List<List<Integer>> res = new ArrayList<>();
3 if (root == null) return res;
4 Queue<TreeNode> q = new LinkedList<>();
5 q.offer(root);
6 while (!q.isEmpty()) {
7 int size = q.size();
8 List<Integer> level = new ArrayList<>();
9 for (int i = 0; i < size; i++) {
10 TreeNode tmp = q.poll();
11 level.add(tmp.val);
12 if (tmp.left != null)
13 q.offer(tmp.left);
14 if (tmp.right != null)
15 q.offer(tmp.right);
16 }
17 res.add(level);
18 }
19 return res;
20 }}
上面的是二叉树的层序遍历,不是这一题的。我们再来看一次这题使用递归的方式该怎么解决,看下代码
1public List<List<Integer>> levelOrder(Node root) {
2 return levelOrder(root, 0, new ArrayList<>());
3}
4
5private List<List<Integer>> levelOrder(Node node, int level, List<List<Integer>> order) {
6 if (node == null) {
7 return order;
8 }
9 List<Integer> list = order.size() > level ? order.get(level) : new ArrayList<>();
10 list.add(node.val);
11 if (order.size() <= level) {
12 order.add(list);
13 }
14 for (Node n : node.children) {
15 levelOrder(n, level + 1, order);
16 }
17 return order;
18}