面试题: 未排序等长 数组, 判断是否互为 permutation
unsorted integer arrays A and B of equal size, determine if B is
permutation of A. 要求O(n) time and O(1) extra space.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
首先O(1)的存储说明这题肯定是用比较校验值的方式。然后这题除了复杂度要求外,主要是两个要求:一是顺序无关,那么有些对顺序敏感的算法就可以放弃了。二是强无碰撞性。
所以我的方法是先读第一个数,进行md5「也可以选择其他摘要算法」后以整数或整数数组「看你用的语言是否自带大数库」的格式存入校验位。然后依次读后面的数并md5之后与校验位做异或将结果存入校验位。最后比较两数组的校验位即可。
我想了一下,估计是可以满足强弱无碰撞的,至于证明,我就真的不会了。
补充,上面异或的方式经过@brayden提醒是有缺陷的,那就改成求和忽略进位吧。每次求和后和(1<<256-1)求与,保留后256bit。
http://stackoverflow.com/questions/10929185/are-two-arrays-permutation-of-each-other
根据 @Chobits 的链接找到了另一个对应问题.
http://stackoverflow.com/questions/10639661/check-if-array-b-is-a-permutation-of-a
最高票的意思是, 弄一个长度为 2^32 的数组作为 hash table, 因为 2^32 是常数,,, 所以是 O(1)... 哭了...