LeetCode刷题之位运算

1342. 将数字变成 0 的操作次数

给你一个非负整数 num ,请你返回将它变成 0 所需要的步数。 如果当前数字是偶数,你需要把它除以 2 ;否则,减去 1 。

示例 1:
输入:num = 14
输出:6
解释:
步骤 1) 14 是偶数,除以 2 得到 7 。
步骤 2) 7 是奇数,减 1 得到 6 。
步骤 3) 6 是偶数,除以 2 得到 3 。
步骤 4) 3 是奇数,减 1 得到 2 。
步骤 5) 2 是偶数,除以 2 得到 1 。
步骤 6) 1 是奇数,减 1 得到 0 。

示例 2:
输入:num = 8
输出:4
解释:
步骤 1) 8 是偶数,除以 2 得到 4 。
步骤 2) 4 是偶数,除以 2 得到 2 。
步骤 3) 2 是偶数,除以 2 得到 1 。
步骤 4) 1 是奇数,减 1 得到 0 。

题解:
class Solution {
    public int numberOfSteps (int num) {
        int count = 0;
        while (num != 0) {
            //只要num不为0,就要继续循环变化
            if (num % 2 == 0) {
                num /= 2;
            } else {
                num -= 1;
            }
            count++;
        }

        return count;
    }
}
461. 汉明距离

两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x 和 y,计算它们之间的汉明距离。

注意:
0 ≤ x, y < 231.

示例:
输入: x = 1, y = 4
输出: 2

解释:
1 (0 0 0 1)
4 (0 1 0 0)
↑ ↑

上面的箭头指出了对应二进制位不同的位置。

题解:
class Solution {
        public int hammingDistance(int x, int y) {
        String binaryX = Integer.toBinaryString(x);
        String binaryY = Integer.toBinaryString(y);
        int xLength = binaryX.length();
        int yLength = binaryY.length();
        if (xLength < yLength) {
            //补足binaryX长度
            int defLength = yLength - xLength;
            //需要在前面插入0
            StringBuilder stringBuilder = new StringBuilder(binaryX);
            for (int i=0;i yLength) {
            //补足binaryY长度
            int defLength = xLength - yLength;
            //需要在前面插入0
            StringBuilder stringBuilder = new StringBuilder(binaryY);
            for (int i=0;i
剑指 Offer 15. 二进制中1的个数

请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。

示例 1:
输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。

示例 2:
输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。

题解:
public class Solution {
    
    public int hammingWeight(int n) {
        return Integer.bitCount(n);
    }
}
136. 只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:
输入: [2,2,1]
输出: 1

示例 2:
输入: [4,1,2,1,2]
输出: 4

题解:
class Solution {
        /**
     * 使用异或的3个结论
     * 一个数和 0 做 XOR 运算等于本身:a⊕0 = a
     * 一个数和其本身做 XOR 运算等于 0:a⊕a = 0
     * XOR 运算满足交换律和结合律:a⊕b⊕a = (a⊕a)⊕b = 0⊕b = b
     */
    public int singleNumber(int[] nums) {
        //遍历每个元素,循环元素使用异或,会将出现2次的互相异或为0,最终只剩下a^0=a,a为出现一次的元素
        //例如:  b^c^d^b^d = (b^b)^(d^d)^c=0^c=c ,即c为单身的那位
        int result = 0;
        for (int i=0;i

你可能感兴趣的:(LeetCode刷题之位运算)