目录
338比特位计数
题目要求:
解题思路:
1、暴力穷举
遍历一遍 1 到 n,把里面的元素按位与上一个1,如果等于1,则说明当前i的末尾是1,用计数器记录下来,不是则不记录下来,然后再右移1位,如图:
代码:
2、N&(N - 1)公式求解
如图:
代码:
public int[] countBits(int n) {
int[] array = new int[n + 1];
array[0] = 0;
for(int i = 1; i < array.length; i++) {
array[i] = array[i & (i-1)] + 1;
}
return array;
}
3、奇偶数性质解法:
如图:
代码:
public int[] countBits(int n) {
int[] arr = new int[n + 1];
arr[0] = 0;
for(int i = 1; i < arr.length; i++) {
arr[i] = (i = 1 ? arr[i - 1] + 1 : arr[i >> 1];
}
return arr;
}
20有效的括号
题目要求:
解题思路
代码:
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
for(char x : s.toCharArray()) {
if(x == '(') {
stack.push(')');
} else if(x == '[') {
stack.push(']');
} else if(x == '{') {
stack.push('}');
} else if(stack.empty() || stack.pop() != x) {
return false;
}
}
return stack.empty();
}
415字符串相加
题目要求
解题思路
代码:
public String addStrings(String num1, String num2) {
StringBuilder sb = new StringBuilder();
//记录进位的变量
int carry = 0;
//记录字符串的下标
int n1 = num1.length() - 1;
int n2 = num2.length() - 1;
for(; n1 >= 0 || n2 >= 0 || carry != 0; n1--, n2--) {
int c1 = (n1 < 0) ? 0 : (num1.charAt(n1) - '0');
int c2 = (n2 < 0) ? 0 : (num2.charAt(n2) - '0');
sb.append((c1 + c2 + carry) % 10);
carry = (c1 + c2 + carry) / 10;
}
//翻转字符串
return sb.reverse().toString();
}