693.交替位二进制数

  1. 693.交替位二进制数
    1. 693.1 题目
    2. 693.2 题解
      1. 位运算判断相邻位是否相同
      2. 遍历检查相邻位是否相同
    3. 693.3 代码
    4. 693.4 运行结果

693.交替位二进制数


693.1 题目

给定一个正整数,检查它的二进制表示是否总是 0、1 交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。

示例 1:

输入:n = 5
输出:true
解释:5 的二进制表示是:101

示例 2:

输入:n = 7
输出:false
解释:7 的二进制表示是:111

示例 3:

输入:n = 11
输出:false
解释:11 的二进制表示是:1011

提示:

  • 1 <= n <= 2^31 - 1

693.2 题解

位运算判断相邻位是否相同

// 方法一:位运算判断相邻位是否相同
static bool HasAlternatingBits1(int n)
{
    // 使用异或运算判断相邻位是否相同
    // 如果 n 和 n 右移一位的结果进行异或运算得到的结果,再加一,结果为2的幂,则返回 true,否则返回 false
    // n 如果相邻为是交替的 n ^ (n >> 1)得到的是全是1   比如 101  010 异或后变成111
    // 全是1的数+1 得首位为1 后面都是0 111 + 1  1000
    // 在做与全是1的数与 应该是0  000
    return ((n ^ (n >> 1)) + 1 & n) == 0;

    // 这种也可以
    int a = n ^ (n >> 1);
    return (a & (a + 1)) == 0;
}

遍历检查相邻位是否相同

// 方法二:遍历检查相邻位是否相同
static bool HasAlternatingBits2(int n)
{
    // 将 n 转换为二进制字符串
    string binary = Convert.ToString(n, 2);

    // 遍历二进制字符串,检查相邻位是否相同
    for (int i = 1; i < binary.Length; i++)
    {
        // 如果相邻位相同,则返回 false
        if (binary[i] == binary[i - 1])
        {
            return false;
        }
    }

    // 如果所有相邻位都不相同,则返回 true
    return true;
}

693.3 代码

using System;

class Program
{
    static void Main()
    {
        #region 题目

        // 给定一个正整数,检查它的二进制表示是否总是 0、1 交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。

        // 示例 1:
        // 输入:n = 5
        // 输出:true
        // 解释:5 的二进制表示是:101

        // 示例 2:
        // 输入:n = 7
        // 输出:false
        // 解释:7 的二进制表示是:111

        // 示例 3:
        // 输入:n = 11
        // 输出:false
        // 解释:11 的二进制表示是:1011

        // 提示:
        // 1 <= n <= 2^31 - 1

        #endregion

        #region 测试

        // 示例 1
        int n1 = 5;
        bool result1_1 = HasAlternatingBits1(n1);
        Console.WriteLine($"示例1 方法1 输出:{result1_1}");
        bool result1_2 = HasAlternatingBits2(n1);
        Console.WriteLine($"示例1 方法2 输出:{result1_2}");

        // 示例 2
        int n2 = 7;
        bool result2_1 = HasAlternatingBits1(n2);
        Console.WriteLine($"示例2 方法1 输出:{result2_1}");
        bool result2_2 = HasAlternatingBits2(n2);
        Console.WriteLine($"示例2 方法2 输出:{result2_2}");

        // 示例 3
        int n3 = 11;
        bool result3_1 = HasAlternatingBits1(n3);
        Console.WriteLine($"示例3 方法1 输出:{result3_1}");
        bool result3_2 = HasAlternatingBits2(n3);
        Console.WriteLine($"示例3 方法2 输出:{result3_2}");

        #endregion
    }

    #region 答案

    // 方法一:位运算判断相邻位是否相同
    static bool HasAlternatingBits1(int n)
    {
        // 使用异或运算判断相邻位是否相同
        // 如果 n 和 n 右移一位的结果进行异或运算得到的结果,再加一,结果为2的幂,则返回 true,否则返回 false
        // n 如果相邻为是交替的 n ^ (n >> 1)得到的是全是1   比如 101  010 异或后变成111
        // 全是1的数+1 得首位为1 后面都是0 111 + 1  1000
        // 在做与全是1的数与 应该是0  000
        return ((n ^ (n >> 1)) + 1 & n) == 0;
        
        // 这种也可以
        int a = n ^ (n >> 1);
        return (a & (a + 1)) == 0;
    }

    // 方法二:遍历检查相邻位是否相同
    static bool HasAlternatingBits2(int n)
    {
        // 将 n 转换为二进制字符串
        string binary = Convert.ToString(n, 2);

        // 遍历二进制字符串,检查相邻位是否相同
        for (int i = 1; i < binary.Length; i++)
        {
            // 如果相邻位相同,则返回 false
            if (binary[i] == binary[i - 1])
            {
                return false;
            }
        }

        // 如果所有相邻位都不相同,则返回 true
        return true;
    }

    #endregion
}

693.4 运行结果

示例1 方法1 输出:True
示例1 方法2 输出:True
示例2 方法1 输出:False
示例2 方法2 输出:False
示例3 方法1 输出:False
示例3 方法2 输出:False


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏