算法

1.判断一个数是否为素数(质数)

<?php function get_prime($num){ if($num<=1){ return false; } $sq = intval(sqrt($num)); for ($i=2; $i <= $sq; $i++) { if(($num % $i) == 0 ){ break; } } if($i > $sq){ echo $num.'是素数'; }else{ echo $num.'不是素数'; } } get_prime(10); 

2.获取n以内的所有素数(质数)

<?php
function get_primes($n){
  if($n <= 1){
    return false;
  }
  $primes = array(2);
  for($i = 3; $i <= $n; $i += 2){
    $sq = intval(sqrt($i));
    for($j = 3; $j <= $sq; $j += 2){
      if(($i % $j) == 0){
        break;
      }
    }
    if($j > $sq){
      array_push($primes, $i);
    }
  }
  return $primes;
}
print_r(get_primes(27));

3.石头剪刀布判断

  • 当两个数相等时为平局
  • 当p2加一除以3的余数等于p1,则p2获胜
<?php
//0 石头 1剪刀 2布
function fingerGuess($p1, $p2){
  if($p1 == $p2){
    echo 'draw';
  }else if($p1 == ($p2+1)%3){
    echo 'p2 win!';
  }else{
    echo 'p1 win!';
  }
}
fingerGuess(0,2);

4.约瑟夫环

一羣猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数, 再数到第m只,在把它踢出去…,如此不停的进行下去, 直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号

<?php
/** * 获取猴王 * @param int $n * @param int $m * @return int */
function get_king_mokey($n, $m) {
  $arr = range(1, $n);
  $i = 0;
  while (count($arr) > 1) {
    $i++;
    $tmp = array_shift($arr);

    if($i % $m != 0){
      array_push($arr, $tmp);
    }
  }
  return $arr[0];
}

5.顺序查找(哨兵)

<?php
/** * 不使用哨兵顺序查找 * @param array $arr 数组 * @param int $res 目的数字 * @return int 返回数字 */
function search($arr, $res){
  for ($i=0; $i < count($arr); $i++) {
      if($arr[$i] == $res){
        return $i;
      }
  }
  return 0;
}
$arr  = array(2, 23, 44, 231, 2315, 21);
if(search($arr, 23) > 0 ){
    echo  "found!";
}else{
    echo  "not found!";
}

echo "<br>";

/** * 使用哨兵顺序查找 * @param array $arr 数组 * @param int $res 目的数字 * @return int 返回数字 */
function search_sentry($arr, $res) {
  // 哨兵
  $arr[count($arr)] = $res;
  $i = 0;
  while ($arr[$i] != $res) {
    $i++;
  }
  return $i;
}

$arr  = array(2, 23, 44, 231, 2315, 21);
if(search_sentry($arr, 24) == count($arr)){
    echo "not found!";
}else{
    echo  "found!";
}

5.冒泡排序

<?php
/** * 冒泡排序1 * @param array $arr 需要排序的数组 * @return array 排序好的数组 */
function bubble_sort($arr) {
  for ($i=1; $i < count($arr); $i++) {
    for ($j=0; $j < count($arr) - $i; $j++) {
      if($arr[$j] > $arr[$j+1]){
        $tmp = $arr[$j];
        $arr[$j] = $arr[$j+1];
        $arr[$j+1] = $tmp;
      }
    }
  }
  return $arr;
}
$arr = array(3, 4, 65, 312, 23);
var_dump(bubble_sort($arr));

/** * 冒泡排序2 * @param array $arr 需要排序的数组 * @return array 排序好的数组 */
function bubble2_sort($arr2){
  for ($i = count($arr2)-1; $i > 0 ; $i--) {
    for ($j=0; $j < $i; $j++) {
      if($arr[$j] > $arr[$j+1]){
        $tmp = $arr[$j];
        $arr[$j] = $arr[$j+1];
        $arr[$j+1] = $tmp;
      }
    }
  }
}
$arr = array(3, 4, 65, 44, 23, 1, 15);
var_dump(bubble_sort($arr));

6.一个数组里最小的1000个数

思路:假设最前面的1000个数为最小的,算出这1000个数中最大的数,然后和第1001个数比较,如果这最大的数比这第1001个数小的话跳过,如果要比这第1001个数大则将两个数交换位置,并算出新的1000个数里面的最大数,再和下一个数比较,以此类推。

<?php
/** * 获取最小的k个数 * @param array $arr 整个数组 * @param int $k 指定的k位 * @return array 最小的k个数的数组 */
function get_min_array($arr, $k) {
  $n = count($arr);
  $min_array = array();
  for ($i=0; $i < $n; $i++) {
    if($i < $k){
      $min_array[$i] = $arr[$i];
    }else{
      if($i == $k){
        $max_pos = get_max_pos($min_array);
        $max = $min_array[$max_pos];
      }

      if($arr[$i] < $max){
        $min_array[$max_pos] = $arr[$i];
        $max_pos = get_max_pos($min_array);
        $max = $min_array[$max_pos];
      }
    }
  }
  return $min_array;
}

/** * 获取数组中最大值的下标 * @param array $arr 数组 * @return int 最大值下标 */
function get_max_pos($arr){
  $pos = 0;
  for ($i=1; $i < count($arr); $i++) {
    if($arr[$i] > $arr[$pos]){
      $pos = $i;
    }
  }
  return $pos;
}


$arr = array(3, 5, 2, 23, 1, 15, 2, 16, 4);
var_dump(get_min_array($arr, 5));

7.打乱数组

php自带的打乱数组函数:shuffle()

<?php
/** * 打乱数组 * @param array 数组 * @return array 打乱的数组 */
function diy_shuffle($arr) {
  $n = count($arr);
  for ($i=0; $i < $n; $i++) {
    $rand_pos = mt_rand(0, $n-1);
    if($i != $rand_pos){
      $tmp = $arr[$i];
      $arr[$i] = $arr[$rand_pos];
      $arr[$rand_pos] = $tmp;
    }
  }
  return $arr;
}
$arr = array(1, 2, 3, 4, 5);
var_dump(diy_shuffle($arr));

8.两个有序int集合是否有相同元素的最优算法

<?php
/** * 有序int数组的相同元素 * @param array $arr1 数组1 * @param array $arr2 数组2 * @return array 相同元素数组 */
function find_array($arr1, $arr2) {
  $i = $j = 0;
  $common_array = array();
  while($i < count($arr1) && $j < count($arr2)){
    if($arr1[$i] < $arr2[$j]){
      $i++;
    }else if($arr1[$i] > $arr2[$j]){
      $j++;
    }else{
      $common_array[] = $arr1[$i];
      $i++;
      $j++;
    }
  }
  return $common_array;
}

$arr1 = array(1, 4, 5, 7, 9, 14, 17);
$arr2 = array(2, 3, 5, 7, 8, 9, 14);
var_dump(find_array($arr1, $arr2));
点赞