Як перевернути С-рядок

С-рядок – масив/послідовність символів що закінчується символом з кодом 0.

void reverse(char*str) 
{ 
    char* end = str; 
    char tmp; 
    if (str) 
    { 
        while (*end++); 
        --end; 
        while (str < end) 
        { 
            tmp =*str; 
            *str++=*end; 
            *end--= tmp; 
        } 
    } 
}

Як прибрати символи-дублікати з С-рядка

Без використання додаткової пам’яті

Починаючи з другого символу для кожного з них перевіряємо чи є такий символ в перевіреному вже рядку. Спочатку в перевіреному рядку лише 1 символ який гарантовано є унікальним.

1 void removeDuplicates(char *str) 2 { 3 int len = strlen(str); 4 if (len < 2) return; 5 6 int tail = 1; 7 for (int i = 1; i < len; ++i) 8 { 9 for (int j = 0; j < tail; ++j) 10 { 11 if (str[i] == str[j]) break; 12 } 13 14 if (j == tail) 15 { 16 str[tail++] = str[i]; 17 } 18 } 19 20 str[tail] = 0; 21 }

З використанням додаткової пам’яті

Просто підраховуємо кількість входжень кожного символу в рядок.

1 void removeDuplicates(char *str) 2 { 3 int len = strlen(str); 4 if (len < 2) return; 5 6 bool hit[256] = { false }; 7 hit[str[0]] = true; 8 9 int tail = 1; 10 for (int i = 1; i < len; ++i) 11 { 12 if (!hit[str[i]]) 13 { 14 hit[str[i]] = true; 15 str[tail++] = str[i]; 16 } 17 } 18 19 str[tail] = 0; 20 }