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
4
-
for(int i = 0; i <= word.length(); i++){
should bei < word.length()
(out of range) -
for(int j = 1; j < word.length(); j++){
would work better withfor(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
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
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
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
Другие решения
-
for(int i = 0; i <= word.length(); i++){
должно бытьi < word.length()
(вне зоны доступа) -
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
-
for(int i = 0; i <= word.length(); i++){
должно бытьi < word.length()
(вне допустимого диапазона) -
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
я становлюсь беспорядочным с кодом и логическими ошибками!
Спасибо за ваше время. Извините за ошибки, которые я произнес в написании слов