以前看到一个题目,大致要求如下:
//在一堆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)); } }