For auto letter word

I want to write a program where I print repeated letters. Here I have code, but it print whole word for me. Can You give me some advice?

#include <iostream>

using namespace std;
int main(){
string slowo, temp, temp2;

cout << "Insert word: ";
cin >> word;

for(int i = 0; i <= word.length(); i++){
    temp = word[i];

    for(int j = 1; j < word.length(); j++){
        temp2 = word[j];

        if(temp == temp2)
            cout << temp2;
    }
}
return 0;
}

asked Apr 8, 2016 at 11:50

falauthy's user avatar

4

  1. for(int i = 0; i <= word.length(); i++){
    should be i < word.length() (out of range)

  2. for(int j = 1; j < word.length(); j++){
    would work better with for(int j = i + 1; ... I guess.

Besides, temp and temp2 is enough to be char (you are constructing new strings which is not necessary).

Note however, that either this or the accepted solution will output the letters multiple times if they repeat more than once. E.g. the word «reparature» will output the letter ‘r’ three times. If you only need to output each repeated letter once, you’ll need to track which letters you already wrote out, for example by std::map (or unordered_map with C++11).

Also, then you can actually process the word in O(n) (with std::unordered_map) or O(n * log n) (with std::map) instead of O(n^2) (the current solution).

Here how to do that in O(n) (amortized):

unordered_map<char, int> mem;
for (int i = 0; i < word.length(); i++){
    const char c = word[i];
    if (mem[c]++ == 1)
       cout << c;
}

answered Apr 8, 2016 at 12:03

EmDroid's user avatar

EmDroidEmDroid

5,86818 silver badges18 bronze badges

Here is one example to do what you want:

#include <iostream>
#include <string>
#include <set>

using namespace std;

int main(){
    string word, temp, temp2;
    set<char> letters;

    cout << "Insert word: ";
    cin >> word;

    for (auto letter1: word) {
        int match = 0;
        for (auto letter2: word) {
            if (letter1 == letter2)
                match++;
            if (match > 1)
                letters.insert(letter1);
        }
    }

    cout << "nRepeated letters found:n";
    for (auto letter:letters)
        cout << letter << "n";

    return 0;
}

Results when running it:

Insert word: anaconda

Repeated letters found:
a
n

answered Apr 8, 2016 at 12:26

Daniel's user avatar

DanielDaniel

3463 silver badges6 bronze badges

1

Try this, no need to have the temporary std::string variables:

// ...

UPDATE As the commenters mentioned correctly, the above will print the characters repeatedly so here is a fix for that:

std::cout << "Insert word: ";

std::string word;
std::cin >> word;

std::set<char> repeated;
for (auto i = 0; i < word.length(); ++i) {
    for (auto j = 0; j < i; ++j) {
        if (word[j] == word[i]) {
            if (repeated.find(word[i]) == repeated.end()) {
                repeated.insert(word[i]);
                std::cout << word[i];
            }
        }
    }
} 

answered Apr 8, 2016 at 12:03

CppChris's user avatar

CppChrisCppChris

1,2169 silver badges14 bronze badges

2

Я хочу написать программу, в которой я печатаю повторяющиеся буквы. Здесь у меня есть код, но он печатает все слово для меня. Вы можете дать мне какой-то совет?

#include <iostream>

using namespace std;
int main(){
string slowo, temp, temp2;

cout << "Insert word: ";
cin >> word;

for(int i = 0; i <= word.length(); i++){
temp = word[i];

for(int j = 1; j < word.length(); j++){
temp2 = word[j];

if(temp == temp2)
cout << temp2;
}
}
return 0;
}

0

Решение

Попробуйте это, не нужно иметь временные переменные std :: string:

// ...

ОБНОВЛЕНИЕ Как правильно упомянуто комментаторы, выше будет печатать символы несколько раз, так что вот исправление для этого:

std::cout << "Insert word: ";

std::string word;
std::cin >> word;

std::set<char> repeated;
for (auto i = 0; i < word.length(); ++i) {
for (auto j = 0; j < i; ++j) {
if (word[j] == word[i]) {
if (repeated.find(word[i]) == repeated.end()) {
repeated.insert(word[i]);
std::cout << word[i];
}
}
}
}

0

Другие решения

  1. for(int i = 0; i <= word.length(); i++){
    должно быть i < word.length() (вне зоны доступа)

  2. for(int j = 1; j < word.length(); j++){
    будет работать лучше с for(int j = i + 1; ... Похоже.

Кроме того, temp а также temp2 достаточно быть char (вы создаете новые строки, которые не нужны).

Обратите внимание, что либо это, либо принятое решение будет выводить буквы несколько раз, если они повторяются более одного раза. Например. слово «reparature» будет выводить букву «r» три раза. Если вам нужно вывести каждую повторяющуюся букву только один раз, вам нужно отследить, какие буквы вы уже написали, например, с помощью std :: map (или unordered_map с C ++ 11).

Кроме того, вы можете обработать слово в O (n) (с помощью std :: unordered_map) или O (n * log n) (с помощью std :: map) вместо O (n ^ 2) (текущее решение).

Вот как это сделать в O (n) (амортизировано):

unordered_map<char, int> mem;
for (int i = 0; i < word.length(); i++){
const char c = word[i];
if (mem[c]++ == 1)
cout << c;
}

2

Вот один пример, чтобы сделать то, что вы хотите:

#include <iostream>
#include <string>
#include <set>

using namespace std;

int main(){
string word, temp, temp2;
set<char> letters;

cout << "Insert word: ";
cin >> word;

for (auto letter1: word) {
int match = 0;
for (auto letter2: word) {
if (letter1 == letter2)
match++;
if (match > 1)
letters.insert(letter1);
}
}

cout << "nRepeated letters found:n";
for (auto letter:letters)
cout << letter << "n";

return 0;
}

Результаты при запуске:

Insert word: anaconda

Repeated letters found:
a
n

1

Given a List of words, return the words that can be typed using letters of alphabet on only one row’s of American keyboard like the image below.

Example 1:

Input: [“Hello”, “Alaska”, “Dad”, “Peace”]
Output: [“Alaska”, “Dad”]


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


Вы можете создать три строки, которые представляют собой три строки букв на клавиатуре, а затем начать обход всех слов, чтобы определить, все ли буквы слова существуют в определенной строке. На что вам нужно обратить внимание, так это на преобразование регистра.

class Solution {
public:
    vector<string> findWords(vector<string>& words) {
        vector<string> ans;
        vector<string> rows = {"qwertyuiop","asdfghjkl","zxcvbnm"};
        for(string word : words) {
            bool row1 = true;// Используется для обозначения, находится ли он в этой строке
            bool row2 = true;
            bool row3 = true;
            for(char ch : word) {
                if(row1) {
                    if(rows[0].find(tolower(ch)) == -1)
                        row1 = false;
                }
                if(row2) {
                    if(rows[1].find(tolower(ch)) == -1)
                        row2 = false;
                }
                if(row3) {
                    if(rows[2].find(tolower(ch)) == -1)
                        row3 = false;
                }
            }

            if(row1 || row2 || row3) {
                ans.push_back(word);
            }
        }
        return ans;
    }
};

Вы также можете сохранить три ряда ключевых букв в хэш-таблице. Ряд букв соответствует числу. Например, буквы в первой строке представлены цифрой 1, второй строке — 2, а в третьей строке — 3. Затем посмотрите, к какой строке принадлежит первая буква слова, а затем сравните, совпадают ли другие буквы слова с первой строкой.

Например, слово: яблоко, соответствующая буква первой буквы в хеш-таблице равна 2, но p соответствует 1 в хеш-таблице, поэтому это не то же самое, что означает, что все буквы слова не находятся в одной строке.

class Solution {
public:
    vector<string> findWords(vector<string>& words) {
        // используется для преобразования в нижний регистр
        class uTol{
          public:
            char easytolow(char in){
              if(in <= 'Z' && in >= 'A'){
                  return in - ('Z' - 'z');
              }
              return in;
            }
        };
        // Используем карту, чтобы отметить количество строк
        unordered_map<char, int> style;

        for(auto letter:"qwertyuiop"){
            style[letter] = 1;
        }
        for(auto letter:"asdfghjkl"){
            style[letter] = 2;
        }
        for(auto letter:"zxcvbnm"){
            style[letter] = 3;
        }

        uTol ul;
        vector<string> result;

        for(auto word: words){
            // Проверяем, какой тип первого элемента
            int category = style[ul.easytolow(word[0])];
            bool isAllsame = true;
            // Проверяем все буквы слова
            for(auto letter:word){
                // Если оно не того же типа, что и первое слово
                if(style[ul.easytolow(letter)] != category){
                    isAllsame = false;
                    break;
                }
            }
            if(isAllsame){
                result.push_back(word);
            }
        }
        return result;
    }
};

Я хочу написать программу, в которой я печатаю повторяющиеся буквы. Здесь у меня есть код, но он печатает для меня все слово. Вы можете дать мне совет?

#include <iostream>

using namespace std;
int main(){
string slowo, temp, temp2;

cout << "Insert word: ";
cin >> word;

for(int i = 0; i <= word.length(); i++){
    temp = word[i];

    for(int j = 1; j < word.length(); j++){
        temp2 = word[j];

        if(temp == temp2)
            cout << temp2;
    }
}
return 0;
}

3 ответа

Лучший ответ

Попробуйте это, не нужно иметь временные переменные std :: string:

// ...

ОБНОВЛЕНИЕ Как правильно упомянули комментаторы, вышеупомянутые символы будут печатать символы повторно, поэтому вот исправление для этого:

std::cout << "Insert word: ";

std::string word;
std::cin >> word;

std::set<char> repeated;
for (auto i = 0; i < word.length(); ++i) {
    for (auto j = 0; j < i; ++j) {
        if (word[j] == word[i]) {
            if (repeated.find(word[i]) == repeated.end()) {
                repeated.insert(word[i]);
                std::cout << word[i];
            }
        }
    }
} 


0

CppChris
8 Апр 2016 в 12:23

Вот один пример того, что вы хотите:

#include <iostream>
#include <string>
#include <set>

using namespace std;

int main(){
    string word, temp, temp2;
    set<char> letters;

    cout << "Insert word: ";
    cin >> word;

    for (auto letter1: word) {
        int match = 0;
        for (auto letter2: word) {
            if (letter1 == letter2)
                match++;
            if (match > 1)
                letters.insert(letter1);
        }
    }

    cout << "nRepeated letters found:n";
    for (auto letter:letters)
        cout << letter << "n";

    return 0;
}

Результаты при запуске:

Insert word: anaconda

Repeated letters found:
a
n


1

Daniel
8 Апр 2016 в 12:33

  1. for(int i = 0; i <= word.length(); i++){
    должно быть i < word.length() (вне допустимого диапазона)

  2. for(int j = 1; j < word.length(); j++){
    Думаю, лучше сработает с for(int j = i + 1; ....

Кроме того, temp и temp2 достаточно, чтобы быть char (вы создаете новые строки, в чем нет необходимости).

Однако обратите внимание, что либо это, либо принятое решение будет выводить буквы несколько раз, если они повторяются более одного раза. Например. слово «reparature» выводит букву «r» три раза. Если вам нужно выводить каждую повторяющуюся букву только один раз, вам нужно будет отслеживать, какие буквы вы уже написали, например, с помощью std :: map (или unordered_map с C ++ 11).

Кроме того, тогда вы можете фактически обработать слово в O (n) (с std :: unordered_map) или O (n * log n) (с std :: map) вместо O (n ^ 2) (текущее решение).

Вот как это сделать за O (n) (амортизировано):

unordered_map<char, int> mem;
for (int i = 0; i < word.length(); i++){
    const char c = word[i];
    if (mem[c]++ == 1)
       cout << c;
}


2

axalis
8 Апр 2016 в 12:28

Я сейчас работаю со string в vector. И я зашел в тупик. Я манипулирую с помощью vector<int> элементов vector<int> и понимаю, как с ними работать! Я знаю, как работать со string ! Но я не могу получить через ту часть, где мне нужно изменить значение элемента string в векторе. Я имею в виду, что не знаю, что делать в loop с «сделать что-то». Поэтому, чтобы быть коротким, я задаю задачу на работе, которую я сейчас работаю.

Прочитайте последовательность слов из cin и сохраните значения в vector После того, как вы прочитали все слова, обработайте vector и измените каждое слово на верхний регистр.

Вот что я до сих пор

int main ()  
{
    vector<string> words;    //Container for all input word
    string inp;              //inp variable will process all input 

    while (cin>>inp)         //read
       words.push_back(inp); //Storing words 

    //Processing vector to make all word Uppercase
    for (int i = 0; i <words.size(); ++i)
     //do something

         words[i]=toupper(i);
    for (auto &e : words)    //for each element in vector 
     //do something

     cout<<e;

    keep_window_open("~");
    return 0;
}  

Этот первый for оператора неправильный, я пытаюсь получить доступ к элементам vector и изменить слова на верхний, но он не работал для меня, его просто образец
Я пытаюсь много способов получить доступ к vector элементу, но при попытке использовать функции-члены string toupper() для vector я становлюсь беспорядочным с кодом и логическими ошибками!
Спасибо за ваше время. Извините за ошибки, которые я произнес в написании слов

Понравилась статья? Поделить с друзьями:
  • For all the saddest word
  • Font use in word
  • For all symbol microsoft word
  • Font tracking in word
  • For all rows excel vba