Porównaj ceny domen i usług IT, sprzedawców z całego świata

Odwróć ciąg bez strrev


Jakiś czas temu podczas wywiadu dostałem zadanie, aby zamienić string w PHP

bez

używając
strrev
.
Moje pierwsze rozwiązanie było takie:
$s = 'abcdefg';
$temp = '';
for ($i = 0, $length = mb_strlen($s); $i < $length; $i++) {
$temp .= $s{$length - $i - 1};
}
var_dump($temp);
// outputs string(7) "gfedcba"

następnie zapytali mnie, czy mogę to zrobić bez podwajania użycia pamięci (nie używam zmiennej
$ temp
ani żadnej innej zmiennej do kopiowania wiersza z powrotem) i nie udało mi się.
Martwiło mnie to i od tego czasu próbowałem kilka razy rozwiązać ten problem, ale konsekwentnie mi się to nie udawało.
Moja ostatnia próba wygląda następująco:
$s = 'abcdefg';
for ($i = 0, $length = mb_strlen($s); $i < $length; $i++) {
$s = $s{$i * 2} . $s;
}
var_dump($s);
// outputs string(14) "gfedcbaabcdefg"

Odcięcie "abcdefg" po pętli nie jest rozwiązaniem, ponieważ wtedy podwoiłbym ilość używanej pamięci. Muszę usunąć ostatni znak w każdej iteracji pętli.
Próbowałem użyć
mb_substr
w ten sposób:
$s = 'abcdefg';
for ($i = 0, $length = mb_strlen($s); $i < $length; $i++) {
$s = $s{$i * 2} . mb_substr($s, $length - $i - 1, 1);
}
var_dump($s);

ale to daje mi tylko błędy
Uninitialized string offset
.
W tym miejscu utknąłem (ponownie). Próbowałem googlować, ale wszystkie znalezione rozwiązania to albo bezpośrednio znaki
echo
, albo użycie zmiennej tymczasowej.
Znalazłem też pytanie

Odwrócenie napisów PHP bez użycia dodatkowej pamięci
https://coderoad.ru/19055737/
ale nie ma odpowiedzi, która odpowiadałaby moim potrzebom.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

To jest bardzo interesujące.
Oto, co właśnie wymyśliłem:
$s = 'abcdefghijklm';
for($i=strlen($s)-1, $j=0; $j<$i; $i--, $j++) {
list($s[$j], $s[$i]) = array($s[$i], $s[$j]);
}
echo $s;

list ()
może służyć do przypisania listy zmiennych w pojedynczej operacji. Więc po prostu zamieniam znaki (zaczynając od pierwszego i ostatniego, następnie przedostatniego i przedostatniego, i tak dalej, aż dotrą do środka linii)
Wynik to
mlkjihgfedcba
.
Nie używam żadnych innych zmiennych poza
$ s
i licznikami, więc mam nadzieję, że to pasuje do Twoich kryteriów.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz wykorzystać fakt, że w PHP

ciąg można traktować jako tablicę znaków
http://php.net/language.types. ... ubstr
.
Następnie w zasadzie to, co chcesz zrobić, to zastąpić każdy znak
$ i
po lewej stronie środka linii na
$ j
po prawej stronie środka tym samym dystans.
Na przykład w ciągu siedmiu znaków środkowy znak znajduje się na pozycji 3. Znak na pozycji 0 (odległość 3) należy zastąpić znakiem na pozycji 6 (3 + 3), znak na pozycji 1 (odległość 2 ) należy zastąpić znakiem na pozycji 5 (3 + 2) itd.
Ten algorytm można zaimplementować w następujący sposób:
$s = 'abcdefg';$length = strlen($s); 
for ($i = 0, $j = $length-1; $i < ($length/2); $i++, $j--) {
$t = $s[$i];
$s[$i] = $s[$j];
$s[$j] = $t;
}var_dump($s);
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

$string = 'abc';$reverted = implode(array_reverse(str_split($string)));
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz użyć sztuczki zamiany XOR.
function rev($str) {
$len = strlen($str); for($i = 0; $i < floor($len/2); ++$i) {
$str[$i] = $str[$i] ^ $str[$len - $i - 1];
$str[$len - $i - 1] = $str[$i] ^ $str[$len - $i - 1];
$str[$i] = $str[$i] ^ $str[$len - $i - 1];
} return $str;
}print rev("example");
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Spróbuj:
$s = 'abcdefg';for ($i = strlen($s)-1; $i>=0; $i--) {
$s .= $s[$i];
$s[$i] = NULL;
}
var_dump(trim($s));
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

To jest jego wersja PHP7:
echo "\u{202E}abcdefg";// outs: gfedcba
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Ciągi PHP twojego

rodzaj są zmienne
https://stackoverflow.com/a/22982909
ale z powodu kopiowania przy zapisie

bardzo trudno jest je zmienić na miejscu bez wykonania kopii
... Niektóre z powyższych rozwiązań działają, ale tylko dlatego, że są samodzielne; niektóre już zawodzą, ponieważ definiują funkcję bez argumentu przekazywania przez referencję. Aby kod naprawdę działał w miejscu w większym programie, będziesz musiał zwrócić szczególną uwagę na przypisania, argumenty funkcji i zakresy.
Przykład:
$string1 = 'abc';
$string2 = $string1;
$string1[0] = 'b';
print("$string1, $string2");> "abc, bbc"

Przypuszczam, że jeśli między inicjalizacją zmiennej a zmianą kiedykolwiek używałeś tylko przypisań referencyjnych (
& amp; =
) i argumentów referencyjnych (
function rev (& amp; $ string)
) (

lub początkowo przypisz ciąg do właściwości obiektu, a następnie nigdy nie przypisuj go do żadnej innej zmiennej
), ty

czy możesz

zmienić oryginalną wartość ciągu bez wykonywania jakichkolwiek kopii. Jest to jednak trochę zabawne i zakładam, że ankieter, który zadał to pytanie, nie wiedział o kopiowaniu na piśmie.
Nawiasem mówiąc, nie jest to dokładnie to samo, co niezmienność w innych językach, ponieważ dotyczy to również tablic:
$a = [0, 1, 2];
$b = $a;
$b[0] = 1;
print(implode($a).implode($b));> "012112"

Podsumowując, możemy powiedzieć, że wszystkie typy (np

wyjątek

obiekty od PHP5) są przypisywane do kopiowania przy zapisie, chyba że specjalnie użyjesz operatora
& amp; =
. Przypisanie nie kopiuje ich, ale w przeciwieństwie do większości innych języków (C, Java, Python ...), które albo zmieniają oryginalną wartość (tablice), albo w ogóle nie pozwalają na dostęp do zapisu (ciągi znaków), PHP po cichu utworzy skopiuj przed wprowadzeniem jakichkolwiek zmian.
Oczywiście, jeśli przełączysz się na język z bardziej konwencjonalnymi wskaźnikami, a także przełączysz się na tablice bajtowe zamiast ciągów, możesz użyć XOR do zastąpienia każdej pary znaków w miejscu:
for i = 0 ... string.length/2:
string[i] ^= string[string.length-1-i]
string[string.length-1-i] ^= string[i]
string[i] ^= string[string.length-1-i]
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Zasadniczo odpowiedź @EricBouwers, ale możesz usunąć drugą zmienną zastępczą
$ j
function strrev2($str)
{
$len = strlen($str);
for($i=0;$i<$len/2;$i++)
{
$tmp = $str[$i];
$str[$i] = $str[$len-$i-1];
$str[$len-$i-1] = $tmp;
} return $str;
}

Zakończ test:
echo strrev2("Hi there!");// "!ereht iH"
echo PHP_EOL;
echo strrev2("Hello World!");// "!dlroW olleH"

Przejdzie przez listę i zatrzyma się w połowie, zamienia skrajnie lewy i prawy, przesuwa się do wewnątrz i zatrzymuje się na środku. Jeśli liczba jest nieparzysta, cyfra przestawna nigdy nie zamienia się ze sobą, a jeśli jest parzysta, zamienia dwie środkowe liczby i zatrzymuje się. Jedyną dodatkową używaną pamięcią jest
$ len
dla wygody i
$ tmp
do wymiany.
Jeśli potrzebujesz funkcji, która nie zwraca nowej kopii ciągu, ale po prostu edytuje starą, możesz użyć następującego:
function strrev3(&$str)
{
$len = strlen($str);
for($i=0;$i<$len/2;$i++)
{
$tmp = $str[$i];
$str[$i] = $str[$len-$i-1];
$str[$len-$i-1] = $tmp;
}
}$x = "Test String";
echo $x;// "Test String"
strrev3($x);
echo PHP_EOL;
echo $x;// "gnirtS tseT"

Użycie
& amp; $ str
przekazuje bezpośredni wskaźnik do ciągu w celu edycji lokalnej.
A dla prostszej implementacji, takiej jak @treegardens, możesz przepisać jako:
$s = 'abcdefghijklm';
$len = strlen($s);
for($i=0; $i < $len/2; $i++) {
list($s[$i], $s[$len-$i-1]) = array($s[$len-$i-1], $s[$i]);
}
echo $s;

Ma podobną logikę, ale bardzo uprościłem pętlę for.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Oto mój kod, aby rozwiązać twój problem
<?php
$s = 'abcdefg';
for ($i = 0, $length = mb_strlen($s); $i < $length; $i++) {
$s = $s{$i}.mb_substr($s,0,$i).mb_substr($s,$i+1);
}
var_dump($s);
?>
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

To jest za łatwe
//Reverse a String$string = 'Basant Kumar';
$length = strlen($string);for($i=$length-1;$i >=0;$i--){
echo $string[$i];
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz również użyć rekurencji, aby odwrócić ciąg. Coś takiego, na przykład:
function reverse($s) { if(strlen($s) === 1) return $s; return substr($s, strlen($s)-1) . reverse(substr($s , 0, strlen($s)-1));
}

To, co tutaj robisz, to w rzeczywistości zwracanie ostatniego znaku ciągu, a następnie ponowne wywołanie tej samej funkcji z podłańcuchem, który zawiera początkowy ciąg bez ostatniego znaku. Kiedy osiągniesz punkt, w którym twój łańcuch ma tylko jeden znak, zakończysz rekurencję.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz użyć tego kodu do odwrócenia łańcucha bez użycia zarezerwowanej funkcji w php.

Kod

:
<?phpfunction str_rev($y)// function for reversing a string by passing parameters
{
for ($x = strlen($y)-1; $x>=0; $x--) {
$y .= $y[$x];
$y[$x] = NULL;
}echo $y;}
str_rev("I am a student");
?>

Wyjście:
tneduts a ma I

W powyższym kodzie przekazaliśmy wartość ciągu jako parametr. Wykonaliśmy rozkład liniowy za pomocą pętli for.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

możesz użyć
substr
http://php.net/manual/en/function.substr.php
z negatywnym początkiem.

Teoria i wyjaśnienie
>
możesz zacząć od pętli for z liczbą od 1 do długości linii i wywołania
substr
http://php.net/manual/en/function.substr.php
wewnątrz iteracji z
counter * -1
(

która konwertuje licznik na wartość ujemną
) i długość
1
.
Więc za pierwszym razem licznik będzie wynosił
1
i pomnożenie go przez
-1
zamieni go na
-1
Stąd
substr ('abcdefg', -1, 1);
da ci
g

a następna iteracja
substr ('abcdefg', -2, 1);
da ci
f
,

i
substr ('abcdefg', -3, 1);
zwróci
e

itp ...

Kod
>
$str = 'abcdefghijklmnopqrstuvwxyz';
for($i=1; $i <= strlen($str); $i++) {
echo substr($str, $i*-1, 1);
}

W akcji:

https://eval.in/583208
https://eval.in/583208
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

public function checkString($str){
if(!empty($str)){
$i = 0;
$str_reverse = ''; while(isset($str[$i])){
$strArr[] = $str[$i];
$i++;
}
for($j = count($strArr); $j>= 0; $j--){
if(isset($strArr[$j])){
$str_reverse .= $strArr[$j];
}
}
if($str == $str_reverse){
echo 'It is a correct string';
}else{
echo 'Invalid string';
}
}
else{
echo 'string not found.';
}
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

//Reverse String word by word
$str = "Reverse string word by word";
$i = 0;
while ($d = $str[$i]) {
if($d == " ") {
$out = " ".$temp.$out;
$temp = "";
}
else
$temp .= $d; $i++;
}
echo $temp.$out;
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Poniższe rozwiązanie jest bardzo proste, ale spełnia swoje zadanie:
$string = 'Andreas';
$reversedString = '';for($i = mb_strlen($string) - 1; $i >= 0; $i--){
$reversedString .= $string[$i];
}

var_dump ($ reverseString)
następnie wyniki:
string (7) "saerdnA"
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

<?php
$value = 'abcdefg';
$length_value = strlen($value);
for($i = $length_value-1; $i >=0 ;$i--){
echo $value[$i];
}
?>
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Użyłem kilku wbudowanych funkcji, ale żadnej funkcji str_rev.
<?php
$text = "red";$arr = str_split($text);$rev_text = array_reverse($arr);echo join(" ",$rev_text);
?>
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

możesz spróbować tego ...
$string = "NASEEM";
$total_word = strlen($string);
for($i=0; $i<=$total_word; $i++)
{
echo substr($string,$total_word-$i,1);
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

To jest moje rozwiązanie tego problemu.
$in = 'This is a test text';
$out = '';
// find string length
$len = strlen($in);// loop through it and print it reverse
for ( $i = $len - 1; $i >=0;$i-- )
{
$out = $out.$in[$i];
}echo $out;
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:


Spróbuj

<?php
$str="abcde";
for($i=strlen($str)-1;$i>=0;$i--){
echo $str[$i];
}
?>


Wyjście

edcba
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Odwróć ciąg przy użyciu funkcji rekurencyjnej.
$reverseString = '';
function Reverse($str, $len)
{
if ($len == 0) {
return $GLOBALS['reverseString'];
} else {
$len--;
$GLOBALS['reverseString'] .= $str[$len]; return Reverse($str, $len);
}
}$str = 'Demo text';
$len = strlen($str);
echo Reverse($str, $len)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Spróbuj
$warn = 'this is a test'; 
$i=0;
while(@$warn[$i]){
$i++;}
while($i>0)
{
echo $warn[$i-1]; $i--;
}

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się