难度(easy)
题目描述:
现在有一个整数类型的数组,数组中只有一个元素只出现一次,其余元素都出现三次。你需要找出只出现一次的元素。你需要给出一个线性时间复杂度的算法,你能在不使用额外内存空间的情况下解决这个问题么?思路:
因为只有一个元素出现一次,其余元素都出现三次,并且以数组形式存储,那么我们就先对数组进行排序,尽量将相同的元素集中到一起,后面方便查找操作。然后三个一组进行判断,一组中如果第一个元素和第二个元素不等,那么这个只出现一次的元素就找到了,直接返回这组中第一个元素。比如[3,3,3,4,4,4,5,6,6,6,7,7,7],如果前面检查都没问题,那么这个元素一定在最末尾。
代码:
public int singleNumber (int[] A) { // 合法性判断 if(A == null || A.length == 0){ return -1; } //先排序 Arrays.sort(A); //三个一组进行判断 for(int i = 0; i < A.length - 3; i += 3){ //如果有一组中出现内鬼,那么一定在这组中第一个元素,因为排过序 if(A[i] != A[i + 1]) { return A[i]; } } //如果前面的都没问题,那么内鬼肯定在最后了 return A[A.length - 1]; }
———————————————————————————————
封面来自网络,侵删