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

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

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

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

23.03.2011, 01:21. Просмотров 4355. Ответов 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 почему-то не котируется.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2011, 01:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Палиндром-ли вся строка (C++):

Строка палиндром - C++
Дано строку s , которая содержит n символов s1, s2... sn. Оставить его без изменения, если он является палиндромом, то есть s1=sn, s2=s...

Строка-палиндром - C++
Подскажите пожайлуйста, как определить является ли строка палиндромом(можно использовать стандартные строковые подпрограммы) и как...

Как зделать чтобы входная строка, если она не палиндром, делалась палиндромом, т.е. к строке добавлялись недостающие символы? - C++
Как зделать чтобы входная строка, если она не палиндром, делалась палиндромом, т.е. к строке добавлялись недостающие символы?

Считывается не вся матрица - C++
Ввожу матрицу 1 2 3 4 5 6 7 8 9 А считывает только 4 5 7 8 Помогите исправить #include &quot;stdafx.h&quot; #include...

Для всех и вся - Компилятор и IDE! - C++
Мне нужна помощь! Самому очень долго искачать то, что надо. Кто знает какой компилятор и какую прогу лучше использовать для того, чтобы...

Палиндром - C++
Здравствуйте! Наткнулся на такую задачу. Дана строка и нужно посчитать сколько палиндрома можно из нее сделать. Например: ввод: ababc ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
24.03.2011, 00:00  [ТС] #16
rangerx, Ну да. Но пробелы для этого несколько мешают насколько я понимаю.
А про std::equal да согласен. Спасибо)
0
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
24.03.2011, 12:04 #17
Цитата Сообщение от ForEveR Посмотреть сообщение
Но пробелы для этого несколько мешают насколько я понимаю.
Не мешают. Подумай хорошо над алгоритмом.
1
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
24.03.2011, 13:34  [ТС] #18
rangerx, Пока делать нечего решил попробовать написать снова.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <string>
 
bool isPal(const std::string& to_c)
{
    for(int i=0, j=to_c.size()-1; i < j;)
    {
        if(to_c[i] == ' ')
        {
            ++i;
            continue;
        }
        if(to_c[j] == ' ')
        {
            --j;
            continue;
        }
        else if(to_c[i] != to_c[j])
            return false;
        ++i;
        --j;
    }
    return true;
}
 
int main()
{
    std::locale().global(std::locale(""));
    std::cout<<isPal("а         роз   а упа    ла на лапу а    зо     ра");
}
Больше похоже на правду?
0
rangerx
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
24.03.2011, 15:38 #19
Да, но я написал бы как-то так(без всяких continue)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bool isPal(const std::string& s)
{
    // с учётом того что строка может содержать одни пробелы или быть пуста
    std::string::size_type i = s.find_first_not_of(' ');
    if(i == std::string::npos) return false;
    std::string::size_type j = s.find_last_not_of(' ');
 
    while (i < j)
    {
        if (s[i] == ' ') ++i;
        else if (s[j] == ' ') --j;
        else if (s[i++] != s[j--]) return false;
    }
 
    return true;
}
1
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
24.03.2011, 21:21  [ТС] #20
Сегодня был на собеседовании - больше понравилось. Были 3 задачки по почте - сделал. Около 10-15 кодов на самом собеседовании (нужно было исправить или дописать). И тест brainbench - 4.5 балла вышло) Приняли)
1
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;
}
1
zarko97
276 / 36 / 0
Регистрация: 11.10.2015
Сообщений: 381
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;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2017, 22:30
Привет! Вот еще темы с ответами:

Палиндром - C++
Программа находит палиндромы в файле, но не совсем правильно, а именно: проверяет на условие палиндрома только первое слово. Что нужно...

палиндром - C++
имеется 3 класса 1. проверяет является ли строка char* палиндромом 2. проверяет является ли vector&lt;int&gt; палиндромом 3. проверяет...

Палиндром в С++ - C++
Нужно составить программу которая определяет, является ли строчка палиндромом или нет. Написал такую программу, несколько раз проводил...

Палиндром - C++
разработать программу которая определяет является ли данный текст палиндромом в среде C++


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.03.2017, 22:30
Ответ Создать тему
Опции темы

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