Переключение букв в символьной строке с помощью «#», если их нет в массиве символов - PullRequest
0 голосов
/ 28 января 2019
void funOne(char a[], string b, int aL, int bL) {
    int cnt[aL]={0};
    for(int i=0; i<bL; i++) {
        for(int j=0; j<aL; j++) {
            if((char)b[i]==a[j]; {
                cnt[j]++;
                break;
            }
        }
    }
    for(int i=0; i<bL; i++) {
        for(int j=0; j<aL; j++) {
            if((char)b[i]==a[j]&&cnt=0) {
                b[i]='#';
                break;
            }
        }
    }

Существует символ arr[]={'H', 't', 'h', 's', 'e', 'i'}; и строка символов "Sherlock Holmes is a fiction private detective".Каждый символ, которого нет в массиве, должен быть заменен на "#" в строке.

Вывод должен быть

"She##### H###es is # #i#ti#n ##i##te #ete#ti#e"

Что-то не так с моим кодом, но я не знаючто.

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Если вы искали оптимальное решение для решения этой проблемы, проверьте это!:) Идея состоит в том, чтобы хэшировать все символы в массиве, а затем проверять их членство ( Проверка - O (1) ) каждый раз при выполнении итерации по входной строке.

arr = set(['H', 't', 'h', 's', 'e', 'i'])
arr.add(' ') #so that whitespaces don't get replaced
input = 'Sherlock Holmes'
output = str()
for char in input:
    if char not in arr:
        output += '#'
    else:
        output += char

print output

Этот код выполняется за время O (n), но с пробелом O (n).

0 голосов
/ 28 января 2019

Ваш код довольно глючный и излишне сложный.Его можно упростить до чего-то более похожего на это:

void funOne(char a[], int aL, string &b) {
    for(size_t i = 0; i < b.length(); ++i) {
        if (b[i] == ' ') continue;
        // check for other punctuation chars as needed... 
        bool found = false;
        for(int j = 0; j < aL; ++j) {
            if (b[i] == a[j]) {
                found = true;
                break;
            }
        }
        if (!found) b[i] = '#';
    }
}

Что можно еще больше упростить с помощью стандартного алгоритма std::find():

#include <algorithm>

void funOne(char a[], int aL, string &b) {
    char *aEnd = a + aL;
    for(size_t i = 0; i < b.length(); ++i) {
        if (b[i] == ' ') continue;
        // check for other punctuation chars as needed... 
        if (std::find(a, aEnd, b[i]) == aEnd) b[i] = '#';
    }
}

Или с помощью std::string::find_first_not_of()метод:

void funOne(char a[], int aL, string &b) {
    for(size_t i = b.find_first_not_of(a, 0, aL);
        i != string::npos;
        i = b.find_first_not_of(a, i + 1, aL))
    {
        if (b[i] == ' ') continue;
        // check for other punctuation chars as needed... 
        b[i] = '#';
    }
}
...