Znajdziesz algorytmy podejmowania mniej wskazówek, jak tego w miejscu odwrócić
char* str_reverse_in_place(char *str, int len)
{
int i;
for (i = len/2-1 ; i >= 0 ; --i) {
char c = str[i];
str[i] = str[len-i-1];
str[len-i-1] = c;
}
return str;
}
Optymalizacja pod kątem szybkości na tym poziomie, należy spojrzeć na inline hasła, także skompilować (dla gcc) z -O3
(zazwyczaj lepsza praca polega na samodzielnym dodawaniu do rejestru rejestru ...).
Jeśli trzeba mieć odwrócony ciąg gdzie indziej, albo dostarczyć go w funkcji (są przeznaczone dla strlen(str)+1
- faktycznie len+1
tutaj - znaków)
char* str_reverse(char *str, char *reverse, int len)
{
int i;
for (i = len-1 ; i >= 0 ; --i) {
reverse[i] = str[len-i-1];
}
reverse[len] = 0;
return reverse;
}
lub malloc to (będzie musiało być uwolniony przez dzwoniącego).
char* str_reverse_malloc(char *str, int len)
{
char *reverse = malloc(len+1);
if (! reverse) return NULL;
int i;
for (i = len-1 ; i >= 0 ; --i) {
reverse[i] = str[len-i-1];
}
reverse[len] = 0;
return reverse;
}
najszybszym rozwiązaniem? zbuduj ogromną mapę haszującą dla wszystkich łańcuchów i jej odwrotną wartość, masz O (1) czas obliczeń i O (trochę ogromną stałą) pamięć (zakładając, że dane wejściowe są skończone) –
Powinieneś powiedzieć operacje "n/2", a nie ' O (n/2) '. 'O (n/2)' jest takie samo jak 'O (n)', ponieważ stałe nie liczą się w notacji asymptotycznej. Algorytm jest najszybszy w przestrzeni 'O (1)'. Jeśli masz nieograniczoną pamięć, zobacz komentarz @Bryan Chen. – vsoftco
Nie można zwrócić wskaźnika do słowa "słowo", ponieważ jest to zmienna lokalna. To prowadzi do niezdefiniowanego zachowania. Jeśli nie musisz utrzymywać 'str' w stanie nienaruszonym, możesz cofnąć się w innym miejscu, zanim będziesz musiał wczytać' malloc'. – RedX