Leetcode461. 汉明距离

Every day a leetcode

题目来源:461. 汉明距离

解法1:模拟

先将x和y转为为对应二进制的字符串,再遍历两个字符串进行比较。

代码:

/*
 * @lc app=leetcode.cn id=461 lang=cpp
 *
 * [461] 汉明距离
 */

// @lc code=start
class Solution
{
public:
    string trans(int n)
    {
        string result = "";
        while (n > 0)
        {
            result += '0' + n % 2;
            n /= 2;
        }
        reverse(result.begin(), result.end());
        return result;
    }
    int hammingDistance(int x, int y)
    {
        string sx = trans(x);
        string sy = trans(y);
        int ans = 0;
        int i = sx.size() - 1;
        int j = sy.size() - 1;
        while (i >= 0 || j >= 0)
        {
            char item_x = i >= 0 ? sx[i] : '0';
            char item_y = j >= 0 ? sy[j] : '0';
            if (item_x != item_y)
                ans++;
            i--;
            j--;
        }
        return ans;
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(lognlogn),数字转换为字符串用时O(logn),得到的字符串长度为logn,遍历字符串用时O(logn),所以总的时间复杂度为O(lognlogn)。

空间复杂度:O(logn),字符串的存储空间为O(logn)。

解法2:异或

两个整数之间的汉明距离是对应位置上数字不同的位数。

根据以上定义,我们使用异或运算,记为 ⊕,当且仅当输入位不同时输出为 1。

计算 x 和 y 之间的汉明距离,可以先计算 x⊕y,然后统计结果中等于 1 的位数。

代码:

class Solution
{
public:
    int hammingDistance(int x, int y)
    {
        return __builtin_popcount(x ^ y);
    }
};

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(1),不同语言的实现方法不一,我们可以近似认为其时间复杂度为O(1)。

空间复杂度:O(1)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值