五月集训:位运算(初学乍练)

面试题 16.01. 交换数字

题意

编写一个函数,不用临时变量,直接交换numbers = [a, b]ab的值。

示例:

输入: numbers = [1,2]
输出: [2,1]

难度:★☆☆☆☆

答题代码

class Solution {
    public int[] swapNumbers(int[] numbers) {
        numbers[0] = numbers[0] ^ numbers[1];
        numbers[1] = numbers[0] ^ numbers[1];
        numbers[0] = numbers[0] ^ numbers[1]; 

        return numbers;
    }
}

思路:用异或就可以进行交换。

---------------------------------------------------------------------------------------------------------------------------------

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

题意

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

难度:★☆☆☆☆

答题代码

class Solution {
    public int numberOfSteps(int num) {
        int ans = 0;
        while(num != 0)
        {
            if(num % 2 == 1)
            {
                num = num - 1;
                ans++;
            }else
            {
                num = num / 2;
                ans++;
            }
        }
        return ans;
    }
}

---------------------------------------------------------------------------------------------------------------------------------

476. 数字的补数

题意

对整数的二进制表示取反(0 变 1 ,1 变 0)后,再转换为十进制表示,可以得到这个整数的补数。

例如,整数 5 的二进制表示是 "101" ,取反后得到 "010" ,再转回十进制表示得到补数 2 。
给你一个整数 num ,输出它的补数。

 

难度:★★☆☆☆

思路:找到整数最高位的1后在左移一位并减1,然后与整数相减求出补数。值得注意的是java没有无符号类型,可能会超出int的最大范围。所以被减数取long类型,return时long类型和int类型相减要强转int类型。

答题代码

class Solution {
    public int findComplement(int num) {
        long x = 1;
        while(num > x)
        {
            x <<= 1;
        }
        if(num == x)
        {
            return (int)x - 1;
        }
        return (int)x - 1 - num;
    }
}

最后总结:三道题还是比较简单的,但就是要多练熟位运算的使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值