难度困难138
给定一个正整数 n,找出小于或等于 n 的非负整数中,其二进制表示不包含 连续的1 的个数。
示例 1:
1 2 3 4 5 6 7 8 9 10 11
| 输入: 5 输出: 5 解释: 下面是带有相应二进制表示的非负整数<= 5: 0 : 0 1 : 1 2 : 10 3 : 11 4 : 100 5 : 101 其中,只有整数3违反规则(有两个连续的1),其他5个满足规则。
|
说明: 1 <= n <= 109
解答:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| class Solution { public int findIntegers(int num) { int[] dp = new int[32]; dp[0] = 1; dp[1] = 2; for(int i = 2; i < 32; i++) { dp[i] = dp[i - 1] + dp[i - 2]; } String numStr = getBinary(num); int res = 0; for(int i = 0; i < numStr.length(); i++) { if(numStr.charAt(i) == '0') { continue; } res += dp[numStr.length() - i - 1]; if(i != 0 && numStr.charAt(i - 1 ) == '1'){ return res; } } return res + 1; }
private String getBinary(int num) { StringBuilder sb = new StringBuilder(); while(num > 0){ sb.insert(0,num & 1); num >>= 1; } return sb.toString(); } }
|
给定一个只包含三种字符的字符串:(
,)
和 *
,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:
- 任何左括号
(
必须有相应的右括号 )
。
- 任何右括号
)
必须有相应的左括号 (
。
- 左括号
(
必须在对应的右括号之前 )
。
*
可以被视为单个右括号 )
,或单个左括号 (
,或一个空字符串。
- 一个空字符串也被视为有效字符串。
示例 1:
示例 2:
示例 3:
解答:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| class Solution { public boolean checkValidString(String s) { int l = 0, r = 0; for (char c : s.toCharArray()) { if (c == '(') { l++; r++; } else if (c == ')') { l--; r--; } else { l--; r++; } l = Math.max(l, 0); if (l > r) return false; } return l == 0; } }
|
NC45 实现二叉树先序,中序和后序遍历
描述
给定一棵二叉树,分别按照二叉树先序,中序和后序打印所有的节点。
数据范围:0 \le n \le 10000≤n≤1000,树上每个节点的val值满足 0 \le val \le 1000≤val≤100
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
样例解释:
如图二叉树结构
示例1
输入:
返回值:
1
| [[1,2,3],[2,1,3],[2,3,1]]
|
说明:
示例2
返回值:
思路:
- 先,中,后序遍历是根节点在先,中,后
- 定义全局变量存储先,中,后序遍历结果
- 递归实现先,中,后序,每次存储根节点
- ArrayList<>存先,中,后序遍历结果
- ArrayList<ArrayList<>>转list[][]
解答:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| import java.util.*;
public class Solution {
List<Integer> pre = new ArrayList<>(); List<Integer> in = new ArrayList<>(); List<Integer> post = new ArrayList<>(); public int[][] threeOrders (TreeNode root) {
List<List<Integer>> ans = new ArrayList<>(); preOrder(root); inOrder(root); postOrder(root); ans.add(pre); ans.add(in); ans.add(post); int[][] res = new int[ans.size()][ans.get(0).size()]; for (int i = 0; i < ans.size(); i++) { for (int j = 0; j < ans.get(0).size(); j++) { res[i][j] = ans.get(i).get(j); } } return res; } public void preOrder(TreeNode root) { if (root == null) return; pre.add(root.val); preOrder(root.left); preOrder(root.right); } public void inOrder(TreeNode root) { if (root == null) return; inOrder(root.left); in.add(root.val); inOrder(root.right); } public void postOrder(TreeNode root) { if (root == null) return; postOrder(root.left); postOrder(root.right); post.add(root.val); } }
|
描述
给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)
例如:
给定的二叉树是{3,9,20,#,#,15,7},
该二叉树层序遍历的结果是
[
[3],
[9,20],
[15,7]
]
提示:
0 <= 二叉树的结点数 <= 1500
示例1
输入:
返回值:
示例2
输入:
复制
返回值:
思路:
解答:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| import java.util.*;
public class Solution {
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>(); public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) { if(root == null) return res; count(root, 0); return res; } public void count(TreeNode node, int level) { if(level == res.size()) { res.add(new ArrayList<Integer>()); } res.get(level).add(node.val); if(node.left != null){ count(node.left, level + 1); } if(node.right != null){ count(node.right, level + 1); } } }
|