From e5ca4773e92c37dddd03ee1b98ab7668b6e684f7 Mon Sep 17 00:00:00 2001 From: Ravi Dev Pandey <62198564+literalEval@users.noreply.github.com> Date: Mon, 28 Nov 2022 10:41:43 +0530 Subject: [PATCH] feat: add Find non repeating number implementation (#2061) * add find_single_number * add fix issues * remove .vscode * add .vscode * Update .vscode/settings.json Co-authored-by: David Leal * chore(fix): minor issues Co-authored-by: David Leal --- .../find_non_repeating_number.cpp | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 bit_manipulation/find_non_repeating_number.cpp diff --git a/bit_manipulation/find_non_repeating_number.cpp b/bit_manipulation/find_non_repeating_number.cpp new file mode 100644 index 000000000..cc63d29cc --- /dev/null +++ b/bit_manipulation/find_non_repeating_number.cpp @@ -0,0 +1,88 @@ +/** + * @file + * @brief Implementation to find the non repeating integer + * in an array of repeating integers. [Single + * Number](https://leetcode.com/problems/single-number/) + * + * @details + * Given an array of integers in which all of the numbers occur exactly + * twice except one integer which occurs only once. Find the non-repeating + * integer. + * + * Worst Case Time Complexity: O(n) + * Space complexity: O(1) + + * @author [Ravidev Pandey](https://github.com/literalEval) + */ + +#include /// for assert +#include /// for IO operations +#include /// storing the numbers + +/** + * @namespace bit_manipulation + * @brief Bit manipulation algorithms + */ +namespace bit_manipulation { +/** + * @namespace find_non_repeating_integer + * @brief Functions to find the non repeating integer + * in an array of repeating integers. [Single + * Number](https://leetcode.com/problems/single-number/) + */ +namespace find_non_repeating_integer { +/** + * @brief The main function implements find single number + * @param nums vector of integers + * @returns returns the integer that occurs only once + */ +int64_t find_non_repeating_integer(const std::vector& nums) { + // The idea is based on the property of XOR. + // We know that 'a' XOR 'a' is '0' and '0' XOR 'b' + // is b. + // Using this, if we XOR all the elements of the array, + // the repeating elements will give '0' and this '0' + // with the single number will give the number itself. + + int _xor = 0; + + for (const int& num: nums) { + _xor ^= num; + } + + return _xor; +} +} // namespace find_non_repeating_integer +} // namespace bit_manipulation + +/** + * @brief Self-test implementations + * @returns void + */ +static void test() { + // n = 10,2 return 14 + + std::vector nums_one{1, 1, 2, 2, 4, 5, 5}; + std::vector nums_two{203, 3434, 4545, 3434, 4545}; + std::vector nums_three{90, 1, 3, 90, 3}; + + assert(bit_manipulation::find_non_repeating_integer:: + find_non_repeating_integer(nums_one) == + 4); // 4 is non repeating + assert(bit_manipulation::find_non_repeating_integer:: + find_non_repeating_integer(nums_two) == + 203); // 203 is non repeating + assert(bit_manipulation::find_non_repeating_integer:: + find_non_repeating_integer(nums_three) == + 1); // 1 is non repeating + + std::cout << "All test cases successfully passed!" << std::endl; +} +/** + * @brief Main function + * @returns 0 on exit + */ +int main() { + test(); // run self-test implementations + return 0; +}