我已经在两款游戏中发现了这种算法/功能,但我一直想知道它背后的逻辑是什么。
基本上,有一个项目列表,每个项目都有一个 id。
例如:
- item_1 的 id:1
- item_2 的 id:2
- item_3 的 id:4
- item_4 的 ID:8
- item_5 的 ID:16
- 等等
每个新项目都会将 id 乘以 2。
然后有一个数字,比方说 4,表示当前项目是什么。这种情况是 item_3
,但棘手的部分是 number 也可以一次选择多个项目,例如 7,即 4 + 2 + 1 (item_3
, item_2
, item_1
) 或 17 即 16 + 1 (item_5
, item_1
)。如果您的列表很长并且对于多项选择仍然非常准确,它可以非常高,如 16384。
我该如何解决这个问题?
您描述的算法基本上是在数字的二进制表示形式中输出 1。
对于7,它的二进制表示是111
。有三个 1:分别在左起的第一个、第二个和第三个位置,所以它是第 1、2 和 3 项。请注意,我们是从左边数起。
另一个例子:
对于 10,它的二进制表示是 1010
。有两个 1:从左边数的第二个和第四个位置,因此输出将是第 2 项和第 4 项。
这是 C# 中的实现。
public static List<int> FindOnes(int number) {
var list = new List<int>();
var binaryString = Convert.ToString(number, 2);
for (int i = 0 ; i < binaryString.Length ; i++) {
if (binaryString[binaryString.Length - i - 1] == '1') {
list.Add(i + 1);
}
}
return list;
}
// usage:
FindOnes(7) // [1,2,3]