Swift 汉明距离 - LeetCode

作者: 韦弦Zhy | 来源:发表于2018-08-11 18:18 被阅读0次
    LeetCode

    题目: 汉明距离

    两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。

    给出两个整数 xy,计算它们之间的汉明距离。

    注意:
    0 ≤ x, y < 231.

    示例:

    输入: x = 1, y = 4
    
    输出: 2
    
    解释:
    1   (0 0 0 1)
    4   (0 1 0 0)
           ↑   ↑
    
    上面的箭头指出了对应二进制位不同的位置。
    
    方案一:最先印入脑海的方法----10进制转2进制然后一一对比,那10进制怎么转2进制?

    参考百度百科:10进制转2进制

    代码一:
    
    func hammingDistance(_ x: Int, _ y: Int) -> Int {
        
        //初始化两个空数组来装各自对应的二进制
        var dicX = [Int]()
        var dicY = [Int]()
       
        //将x,y改成可变的
        var x = x
        var y = y
        
        if (x == 0) {
            dicX.append(0)
        }
        if (y == 0) {
            dicY.append(0)
        }
        
       //对2求余将10进制转换为2进制
        while x != 0 {
            dicX.append(x%2)
            x /= 2
        }
        
        while y != 0 {
            dicY.append(y%2)
            y /= 2
        }
    
        print(dicX)
        print(dicY)
        
        //区分长短是为了方便后面对比
        let short = dicX.count <= dicY.count ? dicX:dicY
        let long  = dicX.count <= dicY.count ? dicY:dicX
        
        var count = 0
        var index = 0
        //一一对比
        for i in 0..<short.count {
            if short[i] != long[i] {
                count += 1
            }
            index = i
        }
        // 统计长的数组中 长出来那部分的1的个数
        if long.count > short.count {
            for i in index+1..<long.count {
                if long[i] == 1 {
                    count += 1
                }
            }
        }
       
        return count
    }
    
    执行用时:36ms

    这个方法是蠢了点、、、但是我也不怕写出来、、、这毕竟也算是一个正常的思路

    方案二:位运算:按位异或+右移运算

    参考百度百科:位运算

    x 和 y 异或得到的就是一个包含所求汉明距离的一个数,此时用右移运算去做统计

    代码二:
    func hammingDistance(_ x: Int, _ y: Int) -> Int {
        
        var num : Int = x ^ y
        var sum : Int = 0
        
        while (num > 0) {
            sum += num & 1 == 1 ? 1 : 0
            num = num >> 1
        }
        return sum
    }
    
    执行用时:12ms
    用Swift开始学习算法中,在LeetCode中开始做初级算法这一章节,将做的题目在此做个笔记,希望有更好方法同学们cue我哦。

    相关文章

      网友评论

        本文标题:Swift 汉明距离 - LeetCode

        本文链接:https://www.haomeiwen.com/subject/gcvcbftx.html