java实现找出数组中只出现一次的元素

找出数组中出现一次的元素

第一种方式,双层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;
    }
}

猜你喜欢

转载自blog.csdn.net/www340300/article/details/131818451
今日推荐