力扣简136 只出现一次的数字

数组的排序 集合set 位运算异或

我只能暴力,题目要求线性复杂度我根本就想不到,最后还是用了平方,乌鱼子!

 

 

package leetcode01;
//给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
//你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
public class Solution136 {

    public static int singleNumber(int[] nums) {
        for(int i=0;i<nums.length;i++) {
            int num = 0;
            for(int j=0;j<nums.length;j++) {    
                if(nums[i]==nums[j]) {
                    num++;
                }
            }
            if(num==1) {
                return nums[i];
            }
            
        }
        return 0;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] nums= {1,2,3,2,1};
        System.out.println(singleNumber(nums));
    }

}

 

 题解1:排序

public static int singleNumber(int[] nums) {
        Arrays.sort(nums);//数组的排序!自动返回排序后的结果!
        for(int i=0;i<nums.length;i =i+2) {
            if(i+1>=nums.length) {
                return nums[i];
            }
            if(nums[i]!=nums[i+1]) {
                return nums[i];
            }
        }
        return 0;
    }

 

题解2:巧用集合set

//利用Set使用额外空间的线性复杂度实现
    public static int singleNumber(int[] nums) {
        Set<Integer> numsSet=new HashSet<Integer>();
        int sumArray=0;
        int sumSet=0;
        for(int i=0;i<nums.length;i++) {
            numsSet.add(nums[i]);
            sumArray=sumArray+nums[i];
        }
        for(int i:numsSet) {
            sumSet=sumSet+i;
        }
        return sumSet*2-sumArray;
    }

 

题解三:异或

 

 

    public static int singleNumber(int[] nums) {
        int res=0;
        for(int i:nums) {
            res=res^i;
        }
        return res;
    }

 

posted @ 2022-05-26 10:20  Ssshiny  阅读(26)  评论(0)    收藏  举报