leetcode.136 只出现一次的数字I

题目描述:

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1]
输出: 1

示例 2:

输入: [4,1,2,1,2]
输出: 4

方法一(^异或运算符)

异或运算符在两个相等运算符之间运算结果为0,例如4^4=0,4^0=4.

根据异或运算符的提点,所有出现两次的数字最后的运算结构都为0,只有出现一次的数字与0运算结果是本身。

代码如下:

public static int singleNumber(int[] nums) {
         int num = 0;
         for (int i = 0; i < nums.length; i++) {
             num = num ^ nums[i];
         }
         return num;
}

方法二(借助HashSet)

思路:将元素添加到HashSet,在添加之前判断集合中是否已有该元素,如果有则移除,否则添加。

代码如下:

public static int singleNumber(int[] nums) {
        HashSet set = new HashSet<Integer>();
        for(int i = 0; i < nums.length; i++){
            if(set.contains(nums[i])) {
            	set.remove(nums[i]);
            }else {
            	set.add(nums[i]);
            }
        }
        int tmp = 0;
        Iterator<Integer> it = set.iterator();
        while(it.hasNext()) {
        	System.out.println(tmp=it.next());
        }
        return tmp;
}

方法三(借助排序)

思路:先将元素排序,这时数组中相等的元素两两相邻,进行判断即可。

public static int singleNumber(int[] nums) {
       Arrays.sort(nums);
		for(int i = 0; i < nums.length - 1; i+=2) {
			if(nums[i] != nums[i+1]) {
				return nums[i];
			}
		}
		return nums[nums.length - 1];
}

方法四(暴力法)

思路:按照数组中的顺序遍历元素,进行比较,没有与选定元素相等的元素则返回。

public static int singleNumber(int[] nums) {
       if(nums.length > 1) {
        for(int i = 0; i < nums.length-1; i++) {
            boolean b = false;
            for(int j = 0; j < nums.length; j ++) {
                if(i == j) continue;
                if(nums[i] == nums[j]) {
                    b = true;
                }        
            }
            if(b == false) return nums[i];
        }
            
            
        }
        return nums[nums.length-1];
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章