Skip to main content

Array Problems

Challenge 2: Single Number

In this lesson, every element appears twice except one element. We solve this using naive, and then we move to solve it more optimally using XOR operator.

In this lesson, every element appears twice except one element. Try to come up with a process to solve this. Use your XOR skills to achieve this.

Introduction

In this question, every element appears twice except one element, which is our answer.

Let’s see how to achieve this using the XOR operator.

Problem statement

We need to write a program that finds the element that is not repeated.

Input: nums = { 4, 1, 2, 9, 1, 4, 2 } 

Output: 9

Explanation: Except for 9, all elements are repeated.

Assume n is non-negative.

Hint: Use the ^ operator to achieve this.

Thought process

We solve this using naive, and then we move to solve it more optimally.

Brute force approach

This is a naive approach. We traverse the entire array twice to achieve this, which is not optimal.

Algorithm

Iterate the elements using two for-loops and find the one that is not repeating.

Complexity analysis

Time Complexity: O(n2)
Space Complexity: O(1).

Hashtable approach

This approach is better than the one we did previously, as we are iterating over all the elements once with O(n) extra memory space.

Algorithm

We use a hash table to avoid the O(n) time required for searching the elements.

Iterate through all elements in nums and set up a key/value pair.

Return the element that appeared only once.

Java

import java.util.HashMap;

class SingleNumber {
    private static int singleNumber(int[] nums) {
        HashMap<Integer, Integer> lookup = new HashMap<>();

        for (int i : nums) {
            lookup.put(i, lookup.getOrDefault(i, 0) + 1);
        }

        for (int i : nums) {
            if (lookup.get(i) == 1) {
                return i;
            }
        }

        return -1;
    }

    public static void main(String[] args) {
        int[] nums = {4, 1, 2, 9, 1, 4, 2};
        System.out.println("Element appearing one time is " + singleNumber(nums));
    }
}

Python

from collections import defaultdict

def singleNumber(nums):
    lookup = defaultdict(int)

    for i in nums:
        lookup[i] += 1

    for i in nums:
        if lookup[i] == 1:
            return i

    return -1

nums = [4, 1, 2, 9, 1, 4, 2]
print("Element appearing one time is", singleNumber(nums))

JavaScript

const SingleNumber = array => {

    function helper (nums) {
        const lookup = {};

        for(let el of nums) {
            lookup[el] = lookup[el] ? ++lookup[el] : 1;
        }

        for(let value of nums) {
            if(lookup[value] === 1) {
                return value;
            }
        }

        return -1;
    }

    return helper (array);
}

const array = [4, 1, 2, 9, 1, 4, 2];
console.log (`Element appearing one time is ${SingleNumber (array)}`);

C++

#include <iostream>
#include <map>

void SingleElement(int *arr, int n) {
    std::map<int, int> my_map;
    std::map<int, int>::iterator it;
    for (int i = 0; i < n; i++) {
        my_map[arr[i]]++;
    }
    for (it = my_map.begin(); it != my_map.end(); it++) {
        if (it->second == 1) {
            std::cout << "Element appearing one time is " << it->first << std::endl;
            return;
        }
    }
}

int main() {
    int arr[] = {4, 1, 2, 9, 1, 4, 2};
    SingleElement(arr, sizeof(arr) / sizeof(arr[0]));
    return 0;
}

TypeScript

export const SingleNumber = (array: number[]): number => {
    function helper(nums: number[]): number {
        const lookup: object = {};

        for (let el of nums) {
            lookup[el] = lookup[el] ? ++lookup[el] : 1;
        }

        for (let value of nums) {
            if (lookup[value] === 1) {
                return value;
            }
        }

        return -1;
    }

    return helper(array);
}

const array: number[] = [4, 1, 2, 9, 1, 4, 2];
console.log(`Element appearing one time is ${SingleNumber(array)}`);

Complexity analysis

Time complexity: O(n). The time complexity of the for loop is O(n). The time complexity of the hash table operation pop is O(1).

Space complexity: O(n). The space required by hash_table is equal to the number of elements in nums.

Math approach

Algorithm

Let’s consider some arbitrary constants and write some formulae.

Consider a and b arbitrary constants, then:

2 * (a + b) − (a + a + b) = b

In another example, ab, and c are arbitrary constants, then:

2 * (a + b + c) − (a + a + b + b + c) = c

Java

import java.util.HashSet;

class SingleNumber {
    private static int singleNumber(int[] nums) {
        int sumOfUniqueElements = 0, totalSum = 0;
        HashSet<Integer> set = new HashSet<>();

        for (int num : nums) {
            if (!set.contains(num)) {
                set.add(num);
                sumOfUniqueElements += num;
            }
            totalSum += num;
        }
        return 2 * sumOfUniqueElements - totalSum;
    }

    public static void main(String[] args) {
        int[] nums = {4, 1, 2, 9, 1, 4, 2};
        System.out.println("Element appearing one time is " + singleNumber(nums));
    }
}

Python

def singleNumber(nums):
    sum_of_unique_elements = 0
    total_sum = 0
    num_set = set()

    for num in nums:
        if num not in num_set:
            num_set.add(num)
            sum_of_unique_elements += num
        total_sum += num

    return 2 * sum_of_unique_elements - total_sum

nums = [4, 1, 2, 9, 1, 4, 2]
print("Element appearing one time is", singleNumber(nums))

JavaScript

const SingleNumber = array => {

    function helper (nums) {
        let sumOfUniqueElements = 0;
        let totalSum = 0;

        //The Set object lets you store unique values of any type, whether primitive values or object references.
        const lookup = new Set ();

        for(let el of nums) {
            if(!lookup.has (el)) {
                lookup.add (el);
                sumOfUniqueElements += el;
            }
            totalSum += el;
        }
        return (2 * sumOfUniqueElements) - totalSum;
    }

    return helper (array);
}

const array = [4, 1, 2, 9, 1, 4, 2];
console.log (`Element appearing one time is ${SingleNumber (array)}`);

C++

#include <map>
#include <iostream>

using namespace std;

int singleNumber(int nums[], int n) {
    map<int, int> m;
    long sum1 = 0, sum2 = 0;

    for (int i = 0; i < n; i++) {
        if (m[nums[i]] == 0) {
            sum1 += nums[i];
            m[nums[i]]++;
        }
        sum2 += nums[i];
    }
    return 2 * (sum1) - sum2;
}

int main() {
    int a[] = {4, 1, 2, 9, 1, 4, 2};
    int n = 7;
    cout << "Element appearing one time is " << singleNumber(a, n) << "\n";
    return 0;
}

TypeScript

export const SingleNumber = (array: number[]): number => {
    function helper(nums: number[]): number {
        let sumOfUniqueElements: number = 0;
        let totalSum: number = 0;

        //The Set object lets you store unique values of any type, whether primitive values or object references.
        const lookup = new Set();

        for (let el of nums) {
            if (!lookup.has(el)) {
                lookup.add(el);
                sumOfUniqueElements += el;
            }
            totalSum += el;
        }
        return (2 * sumOfUniqueElements) - totalSum;
    }

    return helper(array);
}

const array: number[] = [4, 1, 2, 9, 1, 4, 2];
console.log(`Element appearing one time is ${SingleNumber(array)}`);

Complexity analysis

Time complexity: O(n). The time complexity of the for loop is O(n).

Space complexity: O(n). The space required by hash_table is equal to the number of elements in nums.

Coding exercise

First, look at these code snippets above and think of a solution.

Your solution must use the ^ operator.

This problem is designed for your practice, so try to solve it yourself first. If you get stuck, you can always refer to the solution section's solution. Good luck!

// java
// TODO: finish the challenge or check next lesson for solution
class Solution {
    public static int singleNumber(int[] nums) {
       // Write - Your - Code- Here
        
        return -1; // change this, return element appearing one time over the array of elements, if none, return -1
    }
}
# Python
# TODO: finish the challenge or check next lesson for solution
def singelNumber(nums):
	# Write - Your - Code- Here
    
    return -1 # change this, return element appearing one time over the array of elements, if none, return -1
// javascript
// TODO: finish the challenge or check next lesson for solution
const SingleNumber = nums => {
  // Write - Your - Code- Here
        
  return -1; // change this, return element appearing one time over the array of elements, if none, return -1
}
// c++
// TODO: finish the challenge or check next lesson for solution
#include <iostream>
using namespace std;

int singleNumber(int n) {
  // Write - Your - Code- Here
        
  return -1; // change this, return element appearing one time over the array of elements, if none, return -1
}
// typescript
// TODO: finish the challenge or check next lesson for solution
export const SingleNumber = (nums: number[]): number => {
  // Write - Your - Code- Here
        
  return -1; // change this, return element appearing one time over the array of elements, if none, return -1
}

The solution will be explained in the next lesson.