Функция принимает массив с буквами. Количество букв, которые не повторяются, должно быть возвращено
Функция принимает массив с буквами. Количество букв, которые не повторяются, должно быть возвращено. То есть они встречаются только в массиве 1 раз. Использовать нужно меньше дополнительной памяти для решения. Без дополнительных массивов.Теперь я показываю и увеличиваю счетчик каждый раз, когда буквы не совпадают. И я не могу придумать, как сделать это, чтобы функция правильно работает
int isCharacterUnique(const char* str)
{
const int size = strlen(str);
int count = 0;
for (int index = 0; index < size; ++index)
{
for (int j = index + 1; j < size; ++j)
{
if (str[index] != str[j])
{
count += 1;
}
}
}
return count;
}
В main записую так
const char* str = "abcacwqa";
std::cout << "isCharacterUnique: " << isCharacterUnique(str);
В консоле : isCharacterUnique: 24
Ответы (3 шт):
Автор решения: Harry
→ Ссылка
Например, так:
int isCharacterUnique(const char* str)
{
int cnt[256] = {0};
for(const char* s = str; *s; ++s) cnt[(unsigned char)*s]++;
for(int i = 1; i <= 255; ++i) if (cnt[i]==1) cnt[0]++;
return cnt[0];
}
Автор решения: sibedir
→ Ссылка
Вариант для мегамозгов )))
int isCharacterUnique(const char* str)
{
int res = 0;
char flags[256]{};
for (auto p = (unsigned char*)str; *p; ++p) {
switch (flags[*p]) {
case 0:
flags[*p] = 1;
++res;
continue;
case 1:
flags[*p] = 2;
--res;
}
}
return res;
}
Автор решения: MBo
→ Ссылка
Если память экономить (ценой быстродействия), то на основе вашего решения можно сделать так: (проверка)
int isCharacterUnique(const char* str) {
int result = 0;
int size = strlen(str);
for (int index = 0; index < size; ++index) {
int count = 0;
for (int j = 0; j < size; ++j) {
if (str[index] == str[j])
count++;
}
if (count == 1)
result++;
}
return result;
}