某知名网站面试题

zxmxhxcc 2011-10-04 09:46:53
问1个数组N个元素,如何判断里面有重复的 要求不用辅助空间
排序的话可以nlgn
有没有更快的方法?
...全文
194 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ywf550230785 2011-10-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zxmxhxcc 的回复:]

引用 5 楼 zxmxhxcc 的回复:
引用 3 楼 dizuo 的回复:
一次遍历 异或操作就行吧?

明显不行啊~
比如
01、10、11这三个数
遍历异或为00~

而且也没有说重复几次
[/Quote]

我对他的话的理解(以你的例子为例):
第一次将最低位是0的移到前面,1的移到后面:
000 000 010 100 001 101
第二次将次低位是0的移到前面,1的移到后面:
000 000 100 001 101 010
第三次将最高位是0的移到前面,1的移到后面:
000 000 001 010 100 101

这样就排序好了,时间复杂度为O(32*N),无空间消耗,类似基数排序
zxmxhxcc 2011-10-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zxmxhxcc 的回复:]
引用 3 楼 dizuo 的回复:
一次遍历 异或操作就行吧?

明显不行啊~
比如
01、10、11这三个数
遍历异或为00~
[/Quote]
而且也没有说重复几次
zxmxhxcc 2011-10-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dizuo 的回复:]
一次遍历 异或操作就行吧?
[/Quote]
明显不行啊~
比如
01、10、11这三个数
遍历异或为00~
zxmxhxcc 2011-10-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 keeya0416 的回复:]
不失一般性
设这些元素都是int的
判断32个位的情况
用双指针从两头往内移动类似快排的方式
把某位是0的交换前半部分,是1的交换到后半部分
如此下去
最后可能会出现数组的某个区间(2个元素)各位情况一样即有重复的元素
没出现这样的情况即无重复的元素
[/Quote]
没明白~
比如(以下二进制表示):
000、001、000、010、101、100
第一次变成
000、000、001、010和101、100
第二次变成
000、000、001和010和101、100
第三次变成
000、000和001和010和101和100
然后所有的位排完后~某个区间内有大于一个的数说明有重复~这样?
ryfdizuo 2011-10-05
  • 打赏
  • 举报
回复
一次遍历 异或操作就行吧?
a13945149916 2011-10-05
  • 打赏
  • 举报
回复
楼上说的我认为可行。用内存对齐的特性
keeya0416 2011-10-04
  • 打赏
  • 举报
回复
不失一般性
设这些元素都是int的
判断32个位的情况
用双指针从两头往内移动类似快排的方式
把某位是0的交换前半部分,是1的交换到后半部分
如此下去
最后可能会出现数组的某个区间(2个元素)各位情况一样即有重复的元素
没出现这样的情况即无重复的元素

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧