Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.91
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
#1

Палиндром-ли вся строка - C++

23.03.2011, 01:21. Просмотров 4193. Ответов 21
Метки нет (Все метки)

Был сегодня на собеседовании, одно из заданий было определить является-ли строка палиндромом.
Пример строки был задан такой: а роза упала на лапу азора.
Пробелы могут быть несемметричны.
Входная строка не должна меняться.

Я написал там на листочке нечто вроде.

C++
1
2
3
4
5
6
7
8
bool isPal(const std::string& str)
{
    std::string new_str=const_cast<char*>(str.c_str());
    new_str.erase(std::remove(new_str.begin(), new_str.end(), ' '), new_str.end());
    std::string new_str_rev=new_str;
    std::reverse(new_str_rev.begin(), new_str_rev.end());
    return new_str == new_str_rev;
}
На что мне сказали, что условие не выполняется. Ну впринципе конечно да, но ведь исходная строка не меняется никаким макаром.

Подумав сейчас решил написать некий такой вариант. Впринципе определяет по идее, но не уверен в правильности.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
bool isPal(const std::string& one)
{
    for(size_t i=0, j=one.size()-1; i < one.size() && j > 0; ++i, --j)
    {
        if(one[i] == ' ')
            ++i;
        if(one[j] == ' ')
            --j;
        else if(one[i] != one[j])
            return false;
    }
    return true;
}
Ну и еще вопрос на засыпку, почему на собеседованиях просят точный ответ на инструкцию вроде

C++
1
2
int i=5; 
i=++i + ++i;
И ответ, что это UB почему-то не котируется.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
08.04.2011, 15:51     Палиндром-ли вся строка #21
сегодня нечем было занятся. вспомнил задачку про палиндром.)
впринцепи решение как у rangerx, за исключением того, что заюзал итераторы.

C++
1
2
3
4
5
6
7
8
9
10
11
12
bool IsPalindrome(const std::string& arg) { 
    std::string::const_iterator it = arg.begin();
    std::string::const_reverse_iterator rev_it = arg.rbegin();
    while(it != arg.end()) {
        
        if(*it == ' ') ++it;
        else if(*rev_it == ' ') ++rev_it;
        else if (*it++ != *rev_it++) return false;
    }
 
    return true;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2017, 22:30     Палиндром-ли вся строка
Еще ссылки по теме:

Палиндром в С++ C++
C++ Палиндром
C++ Палиндром 2 С++
C++ Очищается ли вся динамическая память по завершению программы?
Считывается не вся матрица C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
zarko97
249 / 30 / 0
Регистрация: 11.10.2015
Сообщений: 188
15.03.2017, 22:30     Палиндром-ли вся строка #22
rangerx, зачемж изващаться?
C++
1
2
3
4
5
6
7
8
9
10
11
12
bool isPal(std::string& some)
{
    auto new_end = std::remove(some.begin(), some.end(), ' ');
    some.erase(new_end, some.end());
    auto beg = some.begin(), end = some.end();
    while (beg != --end && beg != end)
    {
        if (*beg++ != *end) 
            return false;
    }
    return true;
}
Yandex
Объявления
15.03.2017, 22:30     Палиндром-ли вся строка
Ответ Создать тему
Опции темы

Текущее время: 05:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru