找出数组中出现一次的元素
第一种方式,双层for循环遍历数组
把每个元素都与数组中的其他元素对比,若没有相同的元素,则此元素只出现一次。代码如下:
public static void getSinglition(){
int[] arrey = new int[]{1,2,3,4,5,3,2,1};
for (int i = 0; i < arrey.length; i++) {
boolean flag = true;
for (int j = 0; j < arrey.length; j++) {
if (arrey[i] == arrey[j] && i != j){ // 排除自身相同的情况
flag = false; // 如何除本身外存在相等的元素,则把flag设为flase
continue;
}
}
// 如果循环一次后,flag没有改变,说明此元素为单个元素
if (flag){
System.out.println(arrey[i]);
}
}
}
优点:可以找出多个出现一次的元素
缺点:时间复杂度高
第二种方式,异或
使用异或的方式有一个前提,只有一个数出现了一次,其他数都是成对出现。
利用异或的特性,用0异或数组中的每一个元素,最后结果就是我们要找的那个只出现一次的元素。异或的特性如下:
1. 0异或一个数等于它本身
2. 一个数异或它自己等于0,即同一个数异或0两次等于0
使用异或方式代码如下:
public void getSinglition(){
int result = 0;
int[] arrey = new int[]{1,2,3,4,3,2,1};
for (int i = 0; i < arrey.length; i++) {
result = result ^ arrey[i];
}
System.out.println(result);
}
优点:时间复杂度小
缺点:只适用数组只存在一个出现一次元素的情况。如果数组中有多个出现一次的元素,则无法找到出现一次的元素。
第三种方式,先对数组排序,如果一个元素和它前一位或后一位的元素都不相等,则此元素在数组中只出现一次。
需要注意数组下标越界。
public void getSinglition(){
int[] arrey = new int[]{1,2,3,4,5,6,3,3,2,1,5};
int len = arrey.length;
Arrays.sort(arrey); // 对数组进行排序
for (int i = 0; i < len; i++) {
if (i ==0){
if (arrey[0] != arrey[1]){
System.out.println(arrey[0]);
}
}
if (i > 0 && i < len - 1){
if (arrey[i-1] != arrey[i] && arrey[i] != arrey[i+1]){
System.out.println(arrey[i]);
}
}
if (i == len - 1){
if (arrey[i - 2] != arrey[i])
System.out.println(arrey[len - 1]);
}
}
}
优点:可以找出数组中多个出现一次的元素
缺点:数组排序,需要消耗额外的时间和空间