我被问到一个很好的编程问题:
在输入中,我从0-255(1字节)获得了100个唯一编号。我一次只能读一个号码。我有40个字节的内存,我可以使用。目标是对所有数字进行排序并在输出中打印它们。我确信数字的唯一性非常重要。
有什么想法吗?
答案 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字节数组,您将通过:
您现在要做的就是在遍历40字节数组时打印与设置位对应的数字。