algorithm – 如何检查存储在其中的无限自然数的8个文件是否可被8整除?

我在面试中遇到了这个问题,正如预期的那样,我无法回答这个问题.我给面试官一个粗略的前瞻性方法:

>在每个文件中添加数字.
>对每个文件中的数字求和,最后检查它是否可被8整除.

与此同时,我告诉他这种方法的缺点,如整数溢出和内存问题.

无论如何,我努力思考但没有成功,因为我到目前为止还没有遇到过这类问题.

如何解决上述问题以及如何开发思维过程以解决这些问题?有没有我可以使用的资源?

最佳答案 由于此问题的性质,您将需要检查文件中的每个数字.这意味着蛮力基本上是唯一的方法.但是,有一些方法可以提高内存效率,减少内存泄漏.下面是一个简单算法的细分,以减少伪代码中的空间复杂度:

Read n integers into array
buffer[ len(array) ] = int array
total = 0

for integer i in array:
    if total % 8 == 0:
        total = 0
        remove all elements in buffer from array
    else
        buffer.append(i)
        total += i
    fi
end for

使用此算法,您可以将数字相加,直到可以将它们除以8,此时您可以从缓冲区中删除所有这些数字并进行更多读取.对于像8这样的小数字,这非常好,特别是对于非常小或非常大的数据文件.我想要注意的是,确实存在一组数字,其中没有连续的子阵列可以被8整除.换句话说,最坏情况下的空间复杂度仍然是O(n).但是,这绝对不是一般情况.

如果你想要更好的空间复杂性,你需要牺牲一点点时间,并为你的代码增加一点点复杂性.我不会为此进入任何伪代码,但基本上你需要匹配数字(或数字组)与相应的模数值.例如,两个整数n和m的和可被8 iff(n%8)(m%8)== 0,8整除.示例:5和3,17和15,12和12.

没有什么可以做到比O(n)更好地获得时间复杂度,但如果它是一个选项,你可以使用多个线程或进程分割工作.

点赞