Skip to content
On this page

每天一道Rust-LeetCode(2020-01-09)

坚持每天一道题,刷题学习Rust.

题目描述

给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。

注意:

给定的整数保证在32位带符号整数的范围内。 你可以假定二进制数不包含前导零位。 示例 1:

输入: 5 输出: 2 解释: 5的二进制表示为101(没有前导零位),其补数为010。所以你需要输出2。 示例 2:

输入: 1 输出: 0 解释: 1的二进制表示为1(没有前导零位),其补数为0。所以你需要输出0。

解题思路

有没有不用循环的思路呢?

解题过程

rust
struct Solution {}
impl Solution {
    pub fn find_complement(num: i32) -> i32 {
        let zeros = num.leading_zeros();
        println!("zeros={}", zeros);
        let ones = 32 - zeros;
        let mut s = 0;
        let mut i = 0;
        while i < ones {
            s |= 1 << i;
            i += 1;
        }
        let mut num = !num;
        num &= s;
        num
    }
}
#[cfg(test)]
mod test {
    use super::*;

    #[test]
    fn test() {
        assert_eq!(Solution::find_complement(3), 0);
        assert_eq!(Solution::find_complement(5), 2);
        assert_eq!(Solution::find_complement(-1), 0);
    }
}

一点感悟

其他

欢迎关注我的github,本项目文章所有代码都可以找到.