LeetCode每日一题——136. Single Number

原题地址: 

https://leetcode.com/problems/single-number/



Fizz Buzz

描述

Given an array of integers, every element appears twice except for one. Find that single one.



举例


解题思路

一开始的想法是循环遍历整个数组,用一个ArrayList做增加判断,如果已经存在了就删掉,不存在就添加,这样到最后ArrayList中剩下的数就是那个单数。


不过最后在网上找到了另外一种更优解,通过异或运算进行判断,虽然都是线性的时间复杂度,不过不设计ArrayList的操作内存耗费低很多。

测试在1000000次情况下第一种方式时间耗费是339,第二种是7,可见数组操作对内存消耗是巨大的,以后应该尽量避免。


作答

public class SingleNumber {
	public static void main(String[] args) {
		int[] nums = { 1, 1, 2, 3, 3, 6, 6, 8, 8, 9, 9 ,12,12,45,45,78,78,56,56,42,32,42,32};
		System.out.println(singleNumber2(nums));
	}

	public static int singleNumber(int[] nums) {
		ArrayList numList = new ArrayList<>();
		for (int i = 0; i < nums.length; i++) {
			if (numList.contains(nums[i])) {
				numList.remove((Integer) nums[i]);
			} else {
				numList.add(nums[i]);
			}
		}
		return numList.get(0);
	}

	//异或运算,不同的比较得0,相同的比较得1
	public static int singleNumber2(int[] A) {
		// Note: The Solution object is instantiated only once and is reused by
		// each test case.
		if (A == null || A.length == 0) {
			return 0;
		}
		int result = A[0];

		for (int i = 1; i < A.length; i++) {
			result = result ^ A[i];
		}
		return result;
	}
}


你可能感兴趣的:(LeetCode)