- 원문
Given an array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
- 해석
정수 배열을 감안할 때 모든 요소는 하나만 제외하고 두 번 나타납니다. 그 하나를 찾아라.
노트:
알고리즘의 선형 런타임 복잡성이 있어야합니다. 여분의 메모리를 사용하지 않고 구현할 수 있습니까?
- 회고
이 문제를 처음 봤을 때 leetcode 문제 중 448. Find All Numbers Disappeared in an Array 문제와 같은 유형의 문제라고 생각했다. 하지만 448번 문제의 경우에는 1번이라도 나온 경우에 음수로 만드는 것이고, 이 문제는 2번 나왔는지를 체크해야하기 때문에 다른 방식으로 접근해야한다. 그 중에서 비트연산을 이용한 해결책을 봤는데 가장 심플한 해결책이라고 생각해 소개하고자 한다. |
- 소스코드
public class Solution { public int singleNumber(int[] nums) { int ans =0; int len = nums.length; for(int i = 0; i < len ;i++){ ans ^= nums[i]; System.out.println(i + " " + ans); } return ans; } }
- Logic
이 문제를 해결하기 위해 bitwise XOR을 사용합니다. 0 ^ N = N N ^ N = 0 따라서 ..... N이 단일 숫자 인 경우
N1 → N1 → N2 → N2 → ... → Nx → Nx → N = (N1 ^ N1) ^ (N2 ^ N2) ^ .............. ^ (Nx ^ Nx) ^ N = 0 ^ 0 ^ .......... ^ 0 ^ N = N 의 방식으로 구할 수 있습니다. |
문제를 풀다보니 비트연산의 특징을 이용한 문제를 많이 보게되어서, 나중에 따로 이에 관련된 내용을 포스팅하도록 하겠다.
'전공지식 > Leetcode문제' 카테고리의 다른 글
448. Find All Numbers Disappeared in an Array (0) | 2016.12.30 |
---|---|
461. Hamming Distance (0) | 2016.12.29 |
SwapPairs 문제 (0) | 2016.11.22 |