The Hamming distance between two integers is the number of positions at which the corresponding bits are different.
Given two integers x
and y
, return the Hamming distance between them.
Example 1:
Input: x = 1, y = 4 Output: 2 Explanation: 1 (0 0 0 1) 4 (0 1 0 0) ↑ ↑ The above arrows point to positions where the corresponding bits are different.
Example 2:
Input: x = 3, y = 1 Output: 1
Constraints:
0 <= x, y <= 231 - 1
一開始蠻困惑,這個定義。還特別上維基百科查了一下。
在資訊理論中,兩個等長字符串之間的漢明距離(英語:Hamming distance)是兩個字符串對應位置的不同字符的個數。換句話說,它就是將一個字符串變換成另外一個字符串所需要替換的字符個數。
漢明重量是字符串相對於同樣長度的零字符串的漢明距離,也就是說,它是字符串中非零的元素個數:對於二進位字符串來說,就是1的個數,所以11101的漢明重量是4。
例如:
- 1011101與1001001之間的漢明距離是2。
- 2143896與2233796之間的漢明距離是3。
- “toned“與”roses“之間的漢明距離是3。
var hammingDistance = function(x, y) { const sX = x.toString(2) const sY = y.toString(2) const range = Math.max(sX.length, sY.length) const stringX = sX.padStart(range, '0') const stringY = sY.padStart(range, '0') let distance = 0 for(let i = 0; i < range; i++) { distance += stringX[i] !== stringY[i] ? 1 : 0 } return distance };
我的做法是轉字串,不足補 0 ,再逐一比對文字。這是比較好懂的做法。
後來查了一下資料,有人提供了一行的解法,要使用 NOR ,蠻騷的做法,理解後再來發一篇吧。
var hammingDistance = function(x, y) { return (x ^ y).toString(2).replace(/0/g, '').length; };