Почему моя функция не переключает первый символ с последней из моей строки? - PullRequest
2 голосов
/ 13 марта 2020

Я поднял вызов на r / dailyprogrammer на reddit, который хочет, чтобы я соответствовал ожерелью и поместил последнюю букву в начале строки. Я подумал об использовании для этого вложенных циклов for, но это сильно смутило меня.
Вместо этого я выбрал способ замены последнего на первый символ в операторе if. Но я не получаю желаемого результата с ним, хотя я перепробовал все, что у меня на уме.
Я использовал даже std :: swap (), который также не привел меня к успеху.

Вот код:

#include <iostream>
#include <string>
#include <algorithm> 

using namespace std;

string same_necklace(string& sInput, string& sOutput)
{
    for (string::size_type i = 0; i < sInput.size(); i++)
    {
        if (sInput[i] == sInput.size())
        {
            sInput[0] = sInput[sInput.size()];
        }
    }

    for (string::size_type j = 0; j < sOutput.size(); j++)
    {
        if (sOutput[j] == sOutput.size() - 1)
        {
            sOutput[0] = sOutput[sOutput.size()];
        }
    }

    return sInput, sOutput;
}

int main()
{
    system("color 2");

    string sName{ "" };
    string sExpectedOutput{ "" };

    cout << "Enter a name: ";
    cin >> sName;
    cout << "Enter expected output: ";
    cin >> sExpectedOutput;


    cout << "Result: " << same_necklace(sName , sExpectedOutput) << endl;

    return 0;
}

И, конечно, ссылка на мою задачу (не волнуйтесь, это просто Reddit!): https://www.reddit.com/r/dailyprogrammer/comments/ffxabb/20200309_challenge_383_easy_necklace_matching/

Хотя Я жду (надеюсь) хорошего ответа, я буду продолжать пытаться решить мою проблему.

Ответы [ 2 ]

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

В вашем if вы сравниваете значение текущего индекса (внутри l oop) с размером строки. Это две несвязанные вещи.
Кроме того, вы используете al oop, хотя вы хотите что-то делать только с одним ранее известным индексом.

for (string::size_type i = 0; i < sInput.size(); i++)
{
    if (sInput[i] == sInput.size())
    {
        sInput[0] = sInput[sInput.size()];
    }
}

Вы можете изменить условие if, например: это для достижения вашей цели:

if (i == sInput.size()-1) /* size as the index is one too high to be legal */

Но то, что достаточно и более элегантно, это сбросить if и l oop. полностью

/* no loop for (string::size_type i = 0; i < sInput.size(); i++)
{ */
    /* no if (sInput[i] == sInput.size())
    {*/
        sInput[0] = sInput[sInput.size()-1]; /* fix the index*/
    /* }
} */

Т.е.

sInput[0] = sInput[sInput.size()-1]; /* fix the index*/

То же самое для вывода, хотя там вы уже получили правильный индекс.

Это не предназначено для решения задачи, которая Вы связались извне,
, если вы хотите, чтобы вам было необходимо полностью и непосредственно описать проблему здесь.
Т.е. это только исправляет ваш код, в соответствии с описанием, которое вы приводите здесь в тексте вашего вопроса,
" поставить последнюю букву в начале строки ".
Она не" переключается "или меняет местами первую и последнюю. Если вы хотите этого, пожалуйста, найдите код, который вы недавно написали (конечно, во время ваших поисков обучения программированию), который меняет значение двух переменных. Адаптируйте этот код к двум индексам (первый и последний, 0 и размер-1), и он произведет замену.

Так много для циклов и ifs, но в вашем коде больше неправильного.

Это

return sInput, sOutput;

не делает то, что вы ожидаете. Читайте об операторе ,, запятом.
Его результатом является второе из двух выражений, а первое оценивается только для побочных эффектов.
Это означает, что

cout << "Result: " << same_necklace(sName , sExpectedOutput) << endl;

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

cout << "Result: " << sName << " " << sExpectedOutput << endl;

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

Это также может не отвечать на вызов, но оно объясняет ваши недоразумения, и вы сможете адаптироваться к вызову сейчас.

1 голос
/ 13 марта 2020

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

Допустим, у вас есть четыре последних слова без шеи, слово нос. Возможна комбинация

1) нос 2) osen 3) сено 4) enos

ваша функция (same_necklace) должна быть в состоянии сказать, что эти строки принадлежат одному и тому же ожерелью

если вы дадите любые две строки в качестве входных данных для своей функции same_necklace, ваша функция должна вернуть true.

если вы дадите одну входную строку из указанной выше группы и вторую входную строку из другого случайного слова, которое не принадлежит указанной выше группе, ваш функция должна возвращать значение false.

В этом смысле вы просто берете свою первую строку в качестве строки без шеи и сравниваете другую строку со всеми возможными комбинациями первой строки.

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

ниже приведена функция, которую вы можете использовать

void swap_character(string &test)
{
    int length = test.length(); 
    test.insert(length, 1, test[0]); 
    test.erase(0, 1);   
}
...