[leetcode, JS] 136. Single Number

mxxn·2023년 8월 10일
0

leetcode

목록 보기
21/198

문제

문제 링크 : Single Number

풀이

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
    let numsMap = new Map();
    nums.forEach(e => {
        numsMap.get(e) ? numsMap.set(e, 2) : numsMap.set(e,1)
    })
    let result = 1
    for(let key of numsMap.keys()) {
       if(numsMap.get(key) === 1) {
           result = key
           break;
       }
    }
    return result;
};
  1. map을 만들고, nums를 순회하며 map에 값이 있으면 value에 2를 set 없다면 1을 set
  2. map을 순회하며 value가 1인 값을 찾아서 return
  • Runtime 58 ms, Memory 47.3 MB

다른 풀이

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function(nums) {
    return nums.reduce((acc, cur) => acc ^ cur)
};
  1. 다른 풀이를 보다 for문에 xor 연산자(^)를 쓴 것을 보고 reduce로 바꿔본 풀이
  • Runtime 49 ms, Memory 42.9 MB

XOR 연산

비트 연산자로 주어진 두 비트에서 다른 값은 1, 같은 값은 0을 반환

예시)

[1,2,2]
1의 비트는 01, 210
1 ^= 2를 계산하면 11이 되어 3
3 ^= 2를 계산하면 1110을 xor 연산하니 01이 되어 1
결과는 1만 남게 됨
즉, 같은 숫자를 두번 xor 연산하게 되면 최초의 숫자만 남음
ex) 1 ^ 2 ^ 2 = 1
  • 위의 풀이에 대입해보면, xor 연산을 통해 배열 내에 1개만 있는 숫자만 남게됨
profile
내일도 글쓰기

0개의 댓글