/** Find the Missing Number * * @reference https://www.geeksforgeeks.org/find-the-missing-number/ * * You are given a list of n-1 integers and these integers are in the range of 1 to n. * There are no duplicates in list. One of the integers is missing in the list. * Write an efficient code to find the missing integer. * * @complexity O(n) */ auto FindTheMissingNumberSum(const ArrayType &integers) { assert(not integers.empty()); const auto N = integers.size() + 1u; const auto sum = N * (N + 1) / 2; return std::accumulate(integers.cbegin(), integers.cend(), sum, std::minus<ArrayType::value_type> {}); }
auto FindTheMissingNumberXor(const ArrayType &integers) { assert(not integers.empty()); const auto N = integers.size() + 1u; auto xor_of_all = integers[0]; for (ArrayType::size_type i = 1ul; i < integers.size(); ++i) { xor_of_all ^= (i ^ integers[i]); } return xor_of_all ^ N ^ integers.size(); }
std::pair<int, int> FindSubarrayWithGivenSum(const ArrayType &integers, const ArrayType::value_type SUM) { assert(not integers.empty()); auto start = integers.cbegin(); auto current_sum = *start; for (auto i = start + 1; i != integers.cend(); ++i) { while (current_sum > SUM and start < i - 1) { current_sum -= *start++; } if (current_sum == SUM) { return std::make_pair(start - integers.cbegin(), i - integers.cbegin() - 1); } current_sum += *i; } return NOT_FOUND; }