算法

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));
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值