利用位运算过滤重复

来源:互联网 发布:网页编程自学 编辑:程序博客网 时间:2024/04/29 17:10

以前看到一个题目,大致要求如下:

//在一堆20以内数字找出重复的,不开辟空间,时间复杂度在O(n)以内//1,2,3,4,5,5,6,6,7,8,9,10,11,12,13,14,15,16,17,18,19,18,15,16,1
    这个题目如果可以开辟空间是很好处理的,但是明确要求了不能开辟空间,因此需要再看看其他思路。
    通过数字特点,我们可以分析如下:数字是在20以内。根据我们队内存的了解,一个int是32位,那么是不是我们可以通过位运算来实现排重呢?
    好吧,废话少说,直接上代码。
int []origins = {1,2,3,4,5,5,6,6,7,8,9,10,11,12,13,14,15,16,17,18,19,18,15,16,15};for (int i : origins) {if ((origins[0] & ((i >> 5) | (1<<i))) != 0) {System.out.println(i);} else {origins[0] |= ((i >> 5) | (1<<i));}}

0 0