给定一个整数数组(正数和负数),每个整数最多具有K位(加上符号位),并且已知数组中所有整数之和也最多具有K位(加上符号位) 。设计一种算法,该算法计算数组中的整数和,所有中间和也最多具有K位(加上符号位)。 [提示:查找应按什么顺序添加正数和负数]。
这是来自面试材料的问题,而不是家庭作业
我实际上是在考虑创建两个单独的数组,一个用于正数,另一个用于负数,对它们进行排序,然后将两者都相加,以使大多数负数与大多数正数相加……但这似乎具有O(nlogn)时间复杂度(排序)和O(n)空间复杂度>请帮助!
最佳答案
首先请注意,即使让立即结果溢出,如果可以表示最终结果,也将始终是正确的。这是因为在包括Java在内的大多数语言中,任何大小的整数类型都像循环组一样起作用(不包括C(整数溢出是未定义的行为,而C#则可能引发溢出异常))。
如果您仍想防止溢出,请按照以下步骤在原地和线性时间内执行:
ni
指向数组的开始(负条目位于其中)。 pi
指向数组的末尾。 sum
为零。 pi >= ni
sum
为负arr[pi]
添加到sum
中。 arr[pi]
为负(我们用尽了正的加数)并且sum
为正(发生了溢出),则结果溢出。 pi
arr[ni]
添加到sum
中。 arr[ni]
为正,而sum
为负,则结果溢出。 ni
。 sum
是否具有超过K
位。如果是这样,则声明结果溢出。