Swift实现汉明距离及字符频率统计时遇filter歧义编译错误
解决Swift中计算汉明距离时的'filter'歧义问题
嘿,我懂你碰到的这个糟心问题了!这个ambiguous use of filter错误本质上是编译器搞不清你要调用哪个版本的filter方法,大概率是处理二进制字符串时,类型推断没跟上导致的。咱们一步步把它搞定:
首先,先把你的思路落地并修正问题。你用异或x ^ y定位不同二进制位的思路完全正确,统计其中'1'的数量就是汉明距离。咱们调整下代码写法,消除歧义:
class Solution { func hammingDistance(_ x: Int, _ y: Int) -> Int { let xor = x ^ y // 先把异或结果转成二进制字符串 let xorBinary = String(xor, radix: 2) // 显式指定闭包参数类型,告诉编译器该用String的filter方法 let oneCount = xorBinary.filter { (char: Character) in char == "1" }.count return oneCount // 如果业务上必须要8位补零的二进制字符串,可以这么写: // let paddedBinary = String(repeating: "0", count: max(0, 8 - xorBinary.count)) + xorBinary // let oneCount = paddedBinary.filter { $0 == "1" }.count // return oneCount } }
为啥会出现歧义?
当你直接写filter { $0 == "1" }时,如果上下文没办法让编译器明确$0的类型(比如链式调用太复杂),它会找到多个匹配的filter方法(不同集合类型的扩展方法),就会抛出歧义错误。咱们通过显式标注闭包参数类型(char: Character),就能帮编译器锁定正确的filter版本。
另外给你个小优化:其实计算汉明距离根本不用转字符串,用位运算效率更高,还能彻底避开filter的问题:
class Solution { func hammingDistance(_ x: Int, _ y: Int) -> Int { var xor = x ^ y var count = 0 while xor != 0 { count += xor & 1 xor >>= 1 } return count } }
这种方法直接操作二进制位,比字符串处理快不少,推荐试试😉
内容的提问来源于stack exchange,提问作者Maria 9905
相关产品推荐
相关产品推荐

