오늘도 코테!
https://leetcode.com/problems/single-number/description/
Given a non-empty array of integers nums, every element appears twice except for one. Find that single one.
You must implement a solution with a linear runtime complexity and use only constant extra space.
Example 1:
Input: nums = [2,2,1]
Output: 1
Example 2:
Input: nums = [4,1,2,1,2]
Output: 4
a linear runtime complexity and use only constant extra space
라는 제약조건이 달려있다. public 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 int singleNumber(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i],map.getOrDefault(nums[i],0)+1);
}
for (int num : nums) {
if (map.get(num) == 1) return num;
}
return 0;
}
public int singleNumber(int[] nums) {
int result = 0;
for (int num : nums) {
result ^= num;
}
return result;
}
문제에서 원하는 답이 뭘까하고 검색하던 중, 비트 연산에서 XOR을 활용하는 방법을 찾았다.
XOR 연산은 두 비트가 서로 다를 때 1을 반환하고, 같을 때는 0을 반환한다. XOR 연산은 교환 법칙과 결합 법칙이 성립하므로, 어떤 순서로 비트를 XOR해도 결과가 같다.
그러므로 배열의 모든 요소를 XOR 연산하면, 등장 횟수가 2인 숫자들은 상쇄되어 결과적으로는 등장 횟수가 1인 숫자만 남게되는 것이다.
연산자 ^
를 이용해 for문으로 ^(XOR)연산을 계속 누적시켜 결국 남는 값을 return하면 정말 간단하게 완료되는 것이다.