cpp: add «2149. Rearrange Array Elements by Sign»
Signed-off-by: Matej Focko <mfocko@redhat.com>
This commit is contained in:
parent
0ed6d6ed64
commit
088cfb5560
1 changed files with 86 additions and 0 deletions
86
cpp/rearrange-array-elements-by-sign.cpp
Normal file
86
cpp/rearrange-array-elements-by-sign.cpp
Normal file
|
@ -0,0 +1,86 @@
|
|||
#include <cassert>
|
||||
#include <vector>
|
||||
|
||||
class Solution {
|
||||
template <typename C> struct arr_iterator {
|
||||
using It = typename C::const_iterator;
|
||||
|
||||
It it, end;
|
||||
|
||||
arr_iterator(const C &container)
|
||||
: it(container.begin()), end(container.end()) {}
|
||||
|
||||
void init() {
|
||||
while (it != end && !predicate(*it)) {
|
||||
++it;
|
||||
}
|
||||
}
|
||||
|
||||
auto operator!=(const It &other_it) const -> bool {
|
||||
return it != other_it;
|
||||
}
|
||||
|
||||
auto operator*() const -> int { return *it; }
|
||||
|
||||
void operator++() {
|
||||
do {
|
||||
++it;
|
||||
} while (it != end && !predicate(*it));
|
||||
}
|
||||
|
||||
virtual auto predicate(int x) const -> bool = 0;
|
||||
virtual ~arr_iterator() {}
|
||||
};
|
||||
|
||||
template <typename C> struct pos_iterator : arr_iterator<C> {
|
||||
pos_iterator(const C &container) : arr_iterator<C>(container) {
|
||||
arr_iterator<C>::init();
|
||||
}
|
||||
auto predicate(int x) const -> bool override { return x > 0; }
|
||||
};
|
||||
|
||||
template <typename C> struct neg_iterator : arr_iterator<C> {
|
||||
neg_iterator(const C &container) : arr_iterator<C>(container) {
|
||||
arr_iterator<C>::init();
|
||||
}
|
||||
auto predicate(int x) const -> bool override { return x < 0; }
|
||||
};
|
||||
|
||||
public:
|
||||
std::vector<int> rearrangeArray(const std::vector<int> &nums) {
|
||||
std::vector<int> result;
|
||||
|
||||
auto positive = pos_iterator(nums);
|
||||
auto negative = neg_iterator(nums);
|
||||
|
||||
for (bool finished = false; !finished;) {
|
||||
finished = true;
|
||||
|
||||
if (positive != nums.end()) {
|
||||
result.push_back(*positive);
|
||||
|
||||
++positive;
|
||||
finished = false;
|
||||
}
|
||||
|
||||
if (negative != nums.end()) {
|
||||
result.push_back(*negative);
|
||||
|
||||
++negative;
|
||||
finished = false;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
int main() {
|
||||
Solution s;
|
||||
|
||||
assert((s.rearrangeArray(std::vector{3, 1, -2, -5, 2, -4}) ==
|
||||
std::vector{3, -2, 1, -5, 2, -4}));
|
||||
assert((s.rearrangeArray(std::vector{-1, 1}) == std::vector{1, -1}));
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in a new issue