算法和數據結構學習中的一些小的工具函數

算法和數據結構學習中的一些小的工具函數

作者:Grey

原文地址:

博客園:算法和數據結構學習中的一些小的工具函數

CSDN:算法和數據結構學習中的一些小的工具函數

提取一個數二進制最右側的 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;
}

更多

算法和數據結構筆記

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章