找出数组中出现一次的元素
第一种方式,双层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]);
}
}
}
优点:可以找出多个出现一次的元素
缺点:时间复杂度为 O(n*2)
第二种方式——异或
使用异或的方式有一个前提,只有一个数出现了一次,其他数都是成对出现。
利用异或的特性,用0异或数组中的每一个元素,最后结果就是我们要找的那个只出现一次的元素。异或的特性如下:
1. 0异或一个数等于它本身
2.一个数异或它自己等于0,即同一个数异或0两次等于0
用leetcode上的一道题为例子:136. 只出现一次的数字 - 力扣(LeetCode)
class Solution {
public int singleNumber(int[] nums) {
int single = 0;
for (int num : nums) {
single ^= num;
}
return single;
}
}
优点:时间复杂度小,也不需要额外的空间
缺点:只适用数组只存在一个出现一次元素的情况。如果数组中有多个出现一次的元素,则无法找到出现一次的元素。
第三种方式,先对数组排序,如果一个元素和它前一位或后一位的元素都不相等,则此元素在数组中只出现一次
用leetcode上的一道题为例子:
136. 只出现一次的数字 - 力扣(LeetCode)
class Solution {
public int singleNumber(int[] nums) {
if(nums.length == 1) return nums[0];
Arrays.sort(nums);
for(int i = 1; i < nums.length; i += 2) {
if (nums[i] != nums[i - 1])
{ return nums[i -1]; }
}
return nums[nums.length - 1];
}
优点:可以找出数组中多个出现一次的元素
缺点:数组排序,需要消耗额外的时间和空间
第四种方式,使用哈希表存储数组元素,如果一个元素对应的value值为1,则这个元素在数组中只出现一次
用leetcode上的一道题为例子:136. 只出现一次的数字 - 力扣(LeetCode)
class Solution {
public int singleNumber(int[] nums) {
HashMap<Integer, Integer>map=new HashMap<>();
for(int i=0;i<nums.length;i++) {
if(map.containsKey(nums[i])) {
map.put(nums[i], map.get(nums[i])+1);
}else {
map.put(nums[i], 1);
}
}
//遍历map
for(int i=0;i<nums.length;i++) {
if(map.get(nums[i])==1) {
return nums[i];
}
}
return -1;
}
}