使用40字节的内存对100个唯一数字进行排序

时间:2013-05-23 18:43:06

标签: algorithm sorting

我被问到一个很好的编程问题:

在输入中,我从0-255(1字节)获得了100个唯一编号。我一次只能读一个号码。我有40个字节的内存,我可以使用。目标是对所有数字进行排序并在输出中打印它们。我确信数字的唯一性非常重要。

有什么想法吗?

2 个答案:

答案 0 :(得分:21)

32个字节为您提供256位,足以维持输入中可见256个可能字节值中的哪一个的位图。一个附加字节用于存储输入值。读取每个值,在位图中标记,然后丢弃。一旦读完所有100个输入值,只需写出与在位图中设置的位相关联的值。

然后问你应该用其他7个字节做什么:)

答案 1 :(得分:12)

由于您的数字是唯一的并且它们只有1个字节长,因此它们必须在0到255之间。将40字节的存储视为长位向量。在读取每个数字时,请在此320位位向量中设置相应的位。读完输入后,转过来扫描该位向量,打印与每个设置位对应的数字。

回应@JavaNewb,这里有更多细节。首先,由于一个字节包含8位,因此它只能假定256个可能值中的一个,即0到255.使用这个小的事实,你可以看到你拥有的40字节存储阵列。该阵列的结果是40字节* 8位/字节= 320位。由于问题表明100个1字节数字中的每一个都是唯一的,因此您知道您最多只能看到一个特定的数字(范围从0到255)。每次看到数字时,都会在40字节数组中设置相应的。例如,如果遇到数字50,则在字节编号6中设置位编号2.数字N对应于字节N%8中的位N/8。保证在此数组中永远不会遇到设置位,因为这意味着在100个数字中存在重复项。读完所有数字后,你会看到40字节的数组。在此数组中设置的每个位对应于您读入的100个数字中的一个。通过从第0字节中的第0位到第31字节中的第7位遍历此40字节数组,您将通过:

  1. 捕获
  2. 中读取的所有数字
  3. 按排序顺序观察
  4. 您现在要做的就是在遍历40字节数组时打印与设置位对应的数字。