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));