Как перевернуть строку в блоках 2 в C ++? - PullRequest
0 голосов
/ 21 января 2012

Что я хочу сделать, это преобразовать строку, такую ​​как "a4b2f0" в "f0b2a4" или более простыми словами:

turning "12345678" into "78563412"

Строка всегда будет иметь четное количество символов, поэтому она всегда будет делиться на 2. Я не совсем уверен, с чего начать.

Ответы [ 4 ]

2 голосов
/ 21 января 2012
static string reverse(string entry) {
    if (entry.size() == 0) {
        return "";
    } else {
        return entry.substr (entry.size() - 2, entry.size()) + reverse(entry.substr (0, entry.size() - 2));
    }
}

Мой метод использует возможности рекурсивного программирования

2 голосов
/ 21 января 2012

Давайте получим эзотерику ... (не проверено! :( И определенно не построено для обработки последовательностей нечетной длины.)

typedef <typename I>
struct backward_pair_iterator {
    typedef I base_t;
    base_t base;
    bool parity;
    backward_pair_iterator(base_t base, parity = false):
    base(base), parity(parity) {
        ++base;
    }
    backward_pair_iterator operator++() {
        backward_pair_iterator result(base, !parity);
        if (parity) { result.base++; result.base++; }
        else { result.base--; }
        return result;
    }
};

template <typename I>
backward_pair_iterator<I> make_bpi(I base) {
    return backward_pair_iterator<I>(base);
}

std::string output(make_bpi(input.rbegin()), make_bpi(input.rend()));
2 голосов
/ 21 января 2012

Один простой способ сделать это:

std::string input = "12345678";
std::string output = input;
std::reverse(output.begin(), output.end());
for(size_t i = 1 ; i < output.size(); i+=2)
    std::swap(output[i-1], output[i]);
std::cout << output << std::endl;

Демоверсия

Немного лучше с точки зрения скорости, так как предыдущий меняет местами элементы дважды, а этот меняет местами каждую пару:

std::string input = "12345678";
std::string output = input;
for(size_t i = 0, middle = output.size()/2, size = output.size(); i < middle ; i+=2 )
{
     std::swap(output[i], output[size - i- 2]);
     std::swap(output[i+1], output[size -i - 1]);
}
std::cout << output << std::endl;

Демо

0 голосов
/ 03 ноября 2012

Простое решение таково:

string input = "12345678";
string output = "";

for(int i = input.length() - 1; i >= 0; i-2)
{
 if(i -1 >= 0){
 output += input[i -1];
 output += input[i];
 }
}

Примечание: Вы должны проверить, если длина строки, когда мод 2 =, потому что в противном случае это будет конец. Сделай что-нибудь, как я делал выше.

...