Questions d'entrevue PHP Questions sur l'algorithme

小云云
Libérer: 2023-03-20 15:10:01
original
17750 Les gens l'ont consulté

Les questions d'algorithme apparaissent souvent dans les questions d'entretien PHP. Cet article partage principalement avec vous les questions d'algorithme des questions d'entretien PHP, dans l'espoir d'aider tout le monde.

Recommandations associées : "Résumé des questions d'entretien PHP 2019 (collection) "

Questions d'entretien - questions d'algorithme :

1 . Tri par insertion (tableau unidimensionnel) L'idée de base : Chaque fois qu'un élément de données à trier est inséré à la position appropriée dans le tableau précédemment trié, de sorte que le tableau soit toujours en ordre jusqu'à ce que tous les éléments de données à trier soient ajoutés. sont jusqu'à ce que l'insertion soit terminée. Exemple :

[mot-clé initial] [49] 38 65 97 76 13 27 49
J=2(38) [38 49] 65 97 76 13 27 49
J=3(65) [38 49 65] 97 76 13 27 49
J=4(97) [38 49 65 97] 76 13 27 49
J=5(76) [38 49 65 76 97] 13 27 49
J=6(13) [13 38 49 65 76 97] 27 49
J=7(27) [13 27 38 49 65 76 97] 49
J=8(49) [13 27 38 49 49 65 76 97]

function insert_sort($arr){
    $count = count($arr); 	
    for($i=1; $i<$count; $i++){ 		
        $tmp = $arr[$i]; 	 	
        $j = $i - 1; 	 	
        while($arr[$j] > $tmp){ 	 		
            $arr[$j+1] = $arr[$j]; 	 		
            $arr[$j] = $tmp; 	 		
            $j--; 	 		
        } 	 
    } 	 
    return $arr; 
}
Copier après la connexion

2. Tri par sélection (tableau unidimensionnel) Idée de base : Chaque passe sélectionne le plus petit (ou le plus grand) élément parmi les éléments de données à trier, l'ordre. est placé à la fin du tableau trié jusqu'à ce que tous les éléments de données à trier soient disposés. Exemple :

[Mot clé initial] [49 38 65 97 76 13 27 49]
13 après le premier tri [38 65 97 76 49 27 49]
13 après le deuxième tri 27 [65 97 76 49 38 49]
Après le troisième tri 13 27 38 [97 76 49 65 49]
Après le quatrième tri 13 27 38 49 [49 97 65 76]
Le cinquième Après le sixième passage de tri , 13 27 38 49 49 [97 97 76]
Après le sixième passage de tri, 13 27 38 49 49 76 [76 97]
Après le septième passage de tri, 13 27 38 49 49 76 76 [ 97]
Résultat final du tri 13 27 38 49 49 76 76 97

function select_sort($arr){ 	
    $count = count($arr); 	
    for($i=0; $i<$count; $i++){ 		
        $k = $i; 	 	
        for($j=$i+1; $j<$count; $j++){ 	 		
            if ($arr[$k] > $arr[$j]) $k = $j; 		
        } 		
        if($k != $i){ 			
            $tmp = $arr[$i]; 			
            $arr[$i] = $arr[$k]; 			
            $arr[$k] = $tmp; 		
        } 	
    } 	
    return $arr; 
}
Copier après la connexion

3. Tri à bulles (tableau unidimensionnel) Idée de base : Comparez les tailles des éléments de données à trier par paire. paire, et constatez que les deux Lorsque l'ordre des éléments de données est inversé, ils sont échangés jusqu'à ce qu'il n'y ait plus d'éléments de données inversés. Processus de tri : Imaginez que le tableau trié R [1..N] soit érigé verticalement et que chaque élément de données soit considéré comme une bulle pondérée. Selon le principe selon lequel les bulles légères ne peuvent pas se trouver sous les bulles lourdes, le tableau R est balayé par le bas. vers le haut. Chaque fois que des bulles légères qui violent ce principe sont scannées, elles sont amenées à « flotter » vers le haut, et ce processus est répété jusqu'à ce que les deux dernières bulles soient la plus légère en haut et la plus lourde en bas. exemple : 49

76 97 65 49 49 49 49 49

13 76 97 65 65 65 65 65
27 27 76 97 76 76 76 76
49 49 49 76 97 97 97



4. Tri rapide (tableau unidimensionnel) Idée de base : prendre n'importe quel élément de données dans la zone non ordonnée actuelle R[1..H] comme "ligne de base" pour la comparaison (il peut être enregistré comme X), utilisez ceci. Le benchmark divise la zone désordonnée actuelle en deux zones désordonnées plus petites à gauche et à droite : R[1..I-1] et R[I 1..H], et les éléments de données à gauche la sous-zone désordonnée est inférieure ou égale à l'élément de référence, les éléments de données dans la sous-zone non ordonnée de droite sont tous supérieurs ou égaux à l'élément de référence et la référence X est située à la position de tri finale, c'est-à-dire R [1..I-1]≤X.Key≤RI 1..H, lorsque R[1..I-1] et R[I 1..H] ne sont pas vides, effectuez le processus de division mentionné ci-dessus sur eux respectivement jusqu'à ce que tous les éléments de données dans les sous-zones non ordonnées aient été triés. Exemple :

Mot clé initial [49 38 65 97 76 13 27 49]
function bubble_sort($array){ 	
    $count = count($array); 	
    if ($count <= 0) return false; 	
    for($i=0; $i<$count; $i++){ 		
        for($j=$count-1; $j>$i; $j--){ 			
            if ($array[$j]<$array[$j-1]){ 				
                $tmp = $array[$j]; 				
                $array[$j] = $array[$j-1]; 				
                $array[$j-1] = $tmp; 			
            } 		
        } 	
    } 	 
    return $array; 
}
Copier après la connexion
Après le premier échange [27 38 65 97 76 13 49 49]
Après le deuxième échange [27 38 49 97 76 13 65 49]

J scanne vers la gauche, la position reste inchangée, après le troisième échange [27 38 13 97 76 49 65 49]

I scanne vers la droite, la position reste inchangée, le quatrième échange Après [27 38 13 49 76 97 65 49]

J scan à gauche [27 38 13 49 76 97 65 49]
(processus d'une division)
mot-clé initial [49 38 65 97 76 13 27 49]
Après un tri [27 38 13] 49 [76 97 65 49]
Après deux tris [13] 27 [38] 49 [49 65] 76 [97]
Trois tris Après cela 13 27 38 49 49 [65] 76 97
Le résultat final du tri 13 27 38 49 49 65 76 97
Le statut après chaque tri



5. log n)

function quickSort(&$arr){    if(count($arr)>1){
        $k=$arr[0];
        $x=array();
        $y=array();
        $_size=count($arr);        for($i=1;$i<$_size;$i++){            if($arr[$i]<=$k){
                $x[]=$arr[$i];
            }elseif($arr[$i]>$k){
                $y[]=$arr[$i];
            }
        }
        $x=quickSort($x);
        $y=quickSort($y);        return array_merge($x,array($k),$y);
    }else{        return$arr;
    }
}
Copier après la connexion

6. Recherche binaire

functionshell_sort(&$arr){    if(!is_array($arr))return;$n=count($arr);    for($gap=floor($n/2);$gap>0;$gap=floor($gap/=2)){        for($i=$gap;$i<$n;++$i){            for($j=$i-$gap;$j>=0&&$arr[$j+$gap]<$arr[$j];$j-=$gap){                $temp=$arr[$j];                $arr[$j]=$arr[$j+$gap];                $arr[$j+$gap]=$temp;
            }
        }
    }
}
Copier après la connexion

7. Suppression du tableau linéaire (dans l'implémentation du tableau)

/** 
* 二分算法查找 
* @param array $array 要查找的数组 
* @param int $min_key 数组的最小下标 
* @param int $max_key 数组的最大下标 
* @param mixed $value 要查找的值 
* @return boolean 
*/ function bin_search($array,$min_key,$max_key,$value){             if($min_key <= $max_key){ 
        $key = intval(($min_key+$max_key)/2); 
        if($array[$key] == $value){ 
            return true; 
        }elseif($value < $array[$key]){ 
            return bin_search($array,$min_key,$key-1,$value);
        }else{ 
            return bin_search($array,$key+1,$max_key,$value);
        } 	
    }else{ 		
        return false; 	
    } 
}
Copier après la connexion
8. Longueur des cordes

function delete_array_element($array, $i)	{ 	
    $len = count($array); 	
    for ($j=$i; $j<$len; $j++){ 		
        $array[$j] = $array[$j+1] 	
    } 	
    array_pop($array); 	
    return $array; 
}
Copier après la connexion
9. Retournement des cordes

function strlen($str)	{ 
    if ($str == &#39;&#39;) return 0; 
    $count = 0; 
    while (1){ 
        if ($str[$count] != NULL){ 
            $count++; 
            continue; 
        }else{ 
            break; 
        } 
    } 
    return $count; 
}
Copier après la connexion

10. Comparaison des cordes

function strrev($str)	{ 	
    if ($str == &#39;&#39;) return 0; 	
    for ($i=(strlen($str)-1); $i>=0; $i--){ 	 
        $rev_str .= $str[$i]; 	
    } 	
    return $rev_str; 
}
Copier après la connexion

11. . Chaîne de recherche

function strcmp($s1, $s2)	{ 
    if (strlen($s1) < strlen($s2)) return -1; 
    if (strlen($s1) > strlen($s2)) return 1; 
    for ($i=0; $i<strlen($s1); $i++){ 
        if ($s1[$i] == $s2[$i]){ 
            continue; 
        }else{ 			
            return false; 
        } 	
    } 	
    return 0; 
}
Copier après la connexion

12. Remplacement de chaîne

function strstr($str, $substr)	{ 
    $m = strlen($str); 
    $n = strlen($substr); 
    if ($m < $n) return false; 
    for ($i=0; $i<=($m-$n+1); $i++){ 
        $sub = substr($str, $i, $n); 
        if (strcmp($sub, $substr) == 0) return $i; 
    } 
    return false; 
}
Copier après la connexion

13. Insérer une chaîne de paragraphe

function str_replace($substr, $newsubstr, $str)	{ 
    $m = strlen($str); 
    $n = strlen($substr); 
    $x = strlen($newsubstr); 
    if (strchr($str, $substr) == false) return false; 
    for ($i=0; $i<=($m-$n+1); $i++){ 
        $i = strchr($str, $substr); 
        $str = str_delete($str, $i, $n); 
        $str = str_insert($str, $i, $newstr); 
    } 
    return $str; 
}
Copier après la connexion
14. chaîne

function str_insert($str, $i, $substr)	{ 
    for($j=0; $j<$i; $j++){ 
        $startstr .= $str[$j]; 
    } 
    for ($j=$i; $j<strlen($str); $j++){ 
        $laststr .= $str[$j]; 
    } 
    $str = ($startstr . $substr . $laststr); 
    return $str; 
}
Copier après la connexion
15. Copier la chaîne

function str_delete($str, $i, $j){ 	
    for ($c=0; $c<$i; $c++){ 
        $startstr .= $str[$c]; 
    } 
    for ($c=($i+$j); $c<strlen($str); $c++){ 
        $laststr .= $str[$c]; 
    } 
    $str = ($startstr . $laststr); 
    return $str; 
}
Copier après la connexion

16. Caractère de connexion Chaîne

function strcpy($s1, $s2){ 
    if (strlen($s1)==NULL || !isset($s2)) return; 
    for ($i=0; $i<strlen($s1); $i++){ 
        $s2[] = $s1[$i]; 
    } 
    return $s2; 
}
Copier après la connexion

17. function (correspondant à la fonction php_decode)

function php_encode($str) { if ($str=='' && strlen($str )>128) return false for($i=0; $i< ;strlen($str); $i++){ $c = ord($str[$i]); si ($c>31 && $c< ;107) $c += 20; c<127) $c -= 75; $word = chr($c); $s .= $word; } return $s; }
function strcat($s1, $s2){ 
    if (!isset($s1) || !isset($s2)) return; 
    $newstr = $s1; 
    for($i=0; $i<count($s); $i++){ 
        $newstr .= $st[$i]; 
    } 
    return $newsstr; 
}
Copier après la connexion

18.

19. Fonction de cryptage simple (correspondant à la fonction php_decrypt)

function php_decode($str)	{ 
    if ($str==&#39;&#39; && strlen($str)>128) return false; 
    for($i=0; $i<strlen($str); $i++){ 
        $c = ord($word); 
        if ($c>106 && $c<127) $c = $c-20; 
        if ($c>31 && $c<107) $c = $c+75; 
        $word = chr($c); 
        $s .= $word; 
    } 
    return $s; 
}
Copier après la connexion

20. Fonction de décryptage simple (correspondant à la fonction php_encrypt)

function php_encrypt($str)	{ 	
    $encrypt_key = 'abcdefghijklmnopqrstuvwxyz1234567890';
    $decrypt_key = 'ngzqtcobmuhelkpdawxfyivrsj2468021359'; 	
    if (strlen($str) == 0) return false; 	 
    for ($i=0; $i<strlen($str); $i++){ 	 
        for ($j=0; $j<strlen($encrypt_key); $j++){ 	 
            if ($str[$i] == $encrypt_key[$j]){ 	 
                $enstr .= $decrypt_key[$j]; 	 
                break; 	 
            } 	 
        } 	 
    } 	
    return $enstr; 
}
Copier après la connexion
Recommandations associées :

L'algorithme classique de PHP interroge Apple
function php_decrypt($str)	{ 
    $encrypt_key = 'abcdefghijklmnopqrstuvwxyz1234567890';
    $decrypt_key = 'ngzqtcobmuhelkpdawxfyivrsj2468021359'; 
    if (strlen($str) == 0) return false; 
    for ($i=0; $i<strlen($str); $i++){ 
        for ($j=0; $j<strlen($decrypt_key); $j++){ 
            if ($str[$i] == $decrypt_key[$j]){ 
                $enstr .= $encrypt_key[$j]; 
                break; 
            } 
        } 
    } 
    return $enstr; 
}
Copier après la connexion

Une question d'algorithme classique causée par une commande Linux couramment utilisée dans le projet

Une brève discussion de quelques questions d'algorithme de base sur les caractères et les tableaux en js

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal