При тестировании моего кода C ++ в XCode, используя «Ab cde Fg» в качестве тестовой строки, мой код возвращает «Не уникальный» ... Почему? Код указан ниже - PullRequest
0 голосов
/ 30 марта 2020

Я практиковался в вопросах интервью на C ++ в XCode, однако я столкнулся с неожиданным поведением, но без ошибок компиляции. Ожидается, что код вернет, содержит ли строка все уникальные символы ASCII или нет. Тестирование моего кода в Xcode на моем Ma c со строкой «Ab cde Fg» возвращает «Не уникальное». Почему это?

bool isUnique1(std::string str)
{
    if (str.length() > 128)
        return false;

    bool * barr = new bool[128];

    for (int i = 0; i < str.length(); i++)
    {
        int val = str[i];

        if (barr[val])
            return false;

        barr[val] = true;
    }

    delete[] barr;
    return true;

}

int main()
{

    std::string name;
    bool result1;

    std::cout << "Enter a string to test: ";
    getline (std::cin, name);

    result1 = isUnique1(name);

    if (result1)
        std::cout << "Unique \n";
    else
        std::cout << "Not Unique \n";

    return 0;
}

1 Ответ

2 голосов
/ 30 марта 2020

Массив не инициализирован. Напишите

bool * barr = new bool[128]();

Обратите внимание, что эта строка

"Ab cde Fg"
   ^   ^

содержит неуникальные пробелы.

Возможно, вам следует написать функцию так, чтобы она игнорировалась пробелы.

Если игнорировать пробелы, то функцию можно определить, например, следующим образом, как показано в демонстрационной программе ниже.

#include <iostream>
#include <iomanip>
#include <string>
#include <set>
#include <cctype>

bool isUnique1( const std::string &s )
{
    std::set<char> set;
    std::pair<std::set<char>::iterator, bool> p( std::set<char>::iterator(), true );

    for ( std::string::size_type i = 0; p.second && i < s.size(); i++ )
    {
        if ( not std::isspace( ( unsigned char )s[i] ) ) p = set.insert( s[i] );
    }

    return p.second;
}

int main() 
{
    std::cout << std::boolalpha << isUnique1( "Ab cde Fg" ) << '\n';

    return 0;
}

Вывод программы:

true

В противном случае, если пробелы нельзя игнорировать, то l oop будет выглядеть как

for ( std::string::size_type i = 0; p.second && i < s.size(); i++ )
{
    p = set.insert( s[i] );
}

Или без al oop функция может быть записана следующим образом

#include <iostream>
#include <iomanip>
#include <string>
#include <set>
#include <iterator>
#include <cctype>

bool isUnique1( const std::string &s )
{
    return std::set<char>( std::begin( s ), std::end( s ) ).size() == s.size();
}

int main() 
{
    const char *s = "abcdefghijklmnopqrstuvwxyz";

    std::cout << std::boolalpha << isUnique1( s ) << '\n';

    return 0;
}

Вывод программы

true
...