算法和數據結構學習中的一些小的工具函數
作者:Grey
原文地址:
提取一個數二進制最右側的 1
比如二進制爲:0100 0001 0001 1011 0001 0001 1001 1000
最右側的1爲: 0000 0000 0000 0000 0000 0000 0000 1000
num & (-num)
或
num & (~num + 1)
打印一個 32 位整數的二進制形式
public static String getBinary(int num) {
StringBuilder sb = new StringBuilder();
for (int i = 31; i >= 0; i--) {
sb.append(((1 << i) & num) == 0 ? "0" : "1");
}
return sb.toString();
}
前綴和數組加速求區間和
在數組不可變的情況下,可以使用前綴和數組加速求區間和,描述見:leetcpde 0303 range sum query immutable
class NumArray {
int[] preSum;
public NumArray(int[] nums) {
preSum = new int[nums.length];
preSum[0] = nums[0];
for (int i = 1; i < nums.length; i++) {
preSum[i] = nums[i] + preSum[i - 1];
}
}
public int sumRange(int left, int right) {
if (left == 0) {
return preSum[right];
}
return preSum[right] - preSum[left - 1];
}
}
注:前綴和只適合數組不可變情況下加速求區間和,如果數組可變,則需要使用線段樹或者樹狀數組來解決這個問題。
要表示 0 ~ range 需要幾個二進制位
public static int getNeedBits(int range) {
int num = 1;
while ((1 << num) - 1 < range) {
num++;
}
return num;
}