javascript - 以精确数量获取项目的算法

标签 javascript java c# python algorithm

<分区>

我已经在两款游戏中发现了这种算法/功能,但我一直想知道它背后的逻辑是什么。

基本上,有一个项目列表,每个项目都有一个 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]

关于javascript - 以精确数量获取项目的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55782469/

相关文章:

javascript - 使用 PHP MySQL 确认 Bootstrap 模式

c# - 如何使用 GeckoFX/C# 获取所有 HTML 属性

java - 如何避免正则表达式中某个字符连续多次出现?

c# - 如何在 C# 中使用字符分隔符将字符串分成两部分?

c# - 将 HttpClient 与 .NET Core 控制台应用程序结合使用

javascript - 如何在移动网络应用程序中滚动 div 的内容?

javascript - 如何传递参数信息异步队列饱和或不饱和?

java - 如何创建 int 文件 :outbound gateway via Java configuration

java - PHP exec() 在执行 java -jar 命令时返回空数组(无输出)

c# - 保存文件对话框,限制名称