比特位计数
给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。
示例 1:
输入: 2
输出: [0,1,1]
示例 2:
输入: 5
输出: [0,1,1,2,1,2]
思路:都知道二进制数,主要靠的就是最后一位来控制整数是奇数还是偶数,每一个偶数/2的二进制中1的个数为偶数的二进制中1的个数,比如:
4: 0100
8: 1000
这里可以看出来他们的1的个数是一样的,由此,可以直接递推。sum[m]=sum[m/2]
代码:
public int[] countBits(int num) {
int[] sum = new int[num + 1];
for (int i = 1; i <= num; i++) {
sum[i] = sum[i / 2];
if ((i & 1) == 1)
sum[i]++;
}
return sum;
}
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/counting-bits
字符串解码
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
示例 1:
输入:s = "3[a]2[bc]"
输出:"aaabcbc"
示例 2:
输入:s = "3[a2[c]]"
输出:"accaccacc"
示例 3:
输入:s = "2[abc]3[cd]ef"
输出:"abcabccdcdcdef"
示例 4:
输入:s = "abc3[cd]xyz"
输出:"abccdcdcdxyz"
思路:在题目中可以看到,假如倍数为1,则没有中括号,并且中括号可以嵌套,所以必须从被嵌套最深的字符串开始执行,那么这样的话,可以用递归解决。
代码:
public String decodeString(String s) {
return dfs(s, 0)[0];
}
private String[] dfs(String str, int i) {
StringBuilder stringBuilder = new StringBuilder();
int sum = 0;
while (i < str.length()) {
if (str.charAt(i) >= '0' && str.charAt(i) <= '9')
sum = sum * 10 + Integer.parseInt(String.valueOf(str.charAt(i)));
else if (str.charAt(i) == '[') {
String[] tmp = dfs(str, i + 1);
i = Integer.parseInt(tmp[0]);
while (sum > 0) {
stringBuilder.append(tmp[1]);
sum--;
}
} else if (str.charAt(i) == ']')
return new String[]{String.valueOf(i), stringBuilder.toString()};
else
stringBuilder.append(str.charAt(i));
i++;
}
return new String[]{stringBuilder.toString()};
}
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/decode-string