Обратные символы каждого слова в предложении. Например:
Меня зовут Алекс
изменения в
yM eman si xela
Я подумал об обычном алгоритме времени O(n)
, использующем два указателя, чтобы указать на любой конец слова и перевернуть его.
Но на сайте ниже
(Обратитесь к ответу на вопрос 2) лучше преобразовать его в связанный список и повторно применить обращение связанного списка для отдельного слова. Я нашел следующее решение для той же программы на Hackerearth:
http://learn.hackerearth.com/question/317/reverse-characters-of-each-word-in-a-sentence/
Это решение занимает O(n)
времени и O(n)
места. Предложенное мной решение занимает O(n)
времени O(1)
места. Чем второй лучше?
Ниже приведен код от Hackerearth:
public node stringReverseChars(node ll){
if(ll == null || ll.next == null)
return ll;
node tmp = ll;
node head = null, prev = null;
while(tmp != null){
while(tmp != null && tmp.data == ' '){
if(head == null)
head = tmp;
prev = tmp;
tmp = tmp.next;
}
if(tmp == null)
break;
node curr = tmp;
while(tmp.next != null && tmp.next.data != ' '){
tmp = tmp.next;
}
node np = tmp.next;
tmp.next = null;
node rev = reverseLL(curr);
if(prev != null)
prev.next = rev;
prev = curr;
curr.next = np;
if(head == null)
head = rev;
tmp = np;
}
return head;
}