1.数组反转函数
function reverse($arr)
{
$count = count($arr);
$left = 0;
$right = $count - 1;
while ($left < $right)
{
$temp = $arr[$left];
$arr[$left++] = $arr[$right];
$arr[$right--] = $temp;
}
return $arr;
}
2.找出两个有序数字元素数组中的相同元素
function find_common($arr1, $arr2)
{
$i = $j = 0;
$common = array();
$count1 = count($arr1);
$count2 = count($arr2);
while ($i < $count1 && $j < $count2)
{
if ($arr1[$i] < $arr2[$j]) {
$i++;
} elseif ($arr1[$i] > $arr2[$j]) {
$j++;
} else {
$common[] = $arr1[$i];
$i++;
$j++;
}
}
return array_unique($common);
}
3.将数组中的元素随机打乱
function custom_shuffle($arr)
{
$count = count($arr);
for ($i = 0; $i < $count; $i++)
{
$rand_pos = mt_rand(0,$count);
if ($rand_pos != $i) {
$temp = $arr[$i];
$arr[$i] = $arr[$rand_pos];
$arr[$rand_pos] = $temp;
}
}
return $arr;
}
4.一个数字字母相连的字符串,让数字和字母对应
function nember_alphabet($str)
{
$number = preg_split('/[a-z]+/', $str, -1, PREG_SPLIT_NO_EMPTY);
$alphabet = preg_split('/d+/', $str, -1, PREG_SPLIT_NO_EMPTY);
$count = count($number);
for ($i = 0; $i < $count; $i++)
{
echo $number[$i].':'.$alphabet[$i].'<br>';
}
}
$str = '1a3bb44a2ac';
number_alphabet($str);
5.求n以内的质数
function get_prime($n)
{
$prime = array(2);
for ($i = 3; $i < $n; $i += 2)
{
$sqrt = intval(sqrt($i));
for ($j = 3; $j <= $sqrt; $j += 2)
{
if ($i % $j == 0) {
break;
}
}
if ($j > $sqrt) {
array_push($prime, $i);
}
}
return $prime;
}
6.约瑟夫环问题
function get_king_mokey($n, $m)
{
$arr = range(1, $n);
$i = 0;
while (count($arr) > 1)
{
$i++;
$survice = array_shift($arr);
if ($i % $m != 0) {
array_push($arr, $survice);
}
}
return $arr[0];
}
7.寻找一个数组里最小的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;
}
function get_max_pos($arr)
{
$pos = 0;
for ($i = 1; $i < count($arr); $i++) {
if ($arr[$i] > $arr[$pos]) {
$pos = $i;
}
}
return $pos;
}
$array = [1, 100, 20, 22, 33, 44, 55, 66, 23, 79, 18, 20, 11, 9, 129, 399, 145, 2469, 58];
$min_array = get_min_array($array, 10);
print_r($min_array);
8.二分查找
function binary_search($array, $n, $value)
{
$left = 0;
$right = $n - 1;
while ($left <= $right) {
$mid = intval(($left + $right) / 2);
if ($value > $mid) {
$right = $mid + 1;
} elseif ($value < $mid) {
$left = $mid - 1;
} else {
return $mid;
}
}
return -1;
}
9.给定一个有序整数序列,找出绝对值最小的元素
function get_min_abs_value($arr)
{
if (is_same_sign($arr[0], $arr[$n - 1])) {
return $arr[0] >= 0 ? $arr[0] : $arr[$n - 1];
}
$n = count($arr);
$left = 0;
$right = $n - 1;
while ($left <= $right) {
if ($left + 1 === $right) {
return abs($arr[$left]) < abs($arr[$right]) ? $arr[$left] : $arr[$right];
}
$mid = intval(($left + $right) / 2);
if ($arr[$mid] < 0) {
$left = $mid + 1;
} else {
$right = $mid - 1;
}
}
}
function is_same_sign($a, $b)
{
if ($a * $b > 0) {
return true;
} else {
return false;
}
}
10.找出有序数组中随机3个数和为0的所有情况
function three_sum($arr)
{
$n = count($arr);
$return = array();
for ($i=0; $i < $n; $i++) {
$left = $i + 1;
$right = $n - 1;
while ($left <= $right) {
$sum = $arr[$i] + $arr[$left] + $arr[$right];
if ($sum < 0) {
$left++;
} elseif ($sum > 0) {
$right--;
} else {
$numbers = $arr[$i] . ',' . $arr[$left] . ',' . $arr[$right];
if (!in_array($numbers, $return)) {
$return[] = $numbers;
}
$left++;
$right--;
}
}
}
return $return;
}
$arr = [-10, -9, -8, -4, -2, 0, 1, 2, 3, 4, 5, 6, 9];
var_dump(three_sum($arr));
11.编写一个PHP函数,求任意n个正负整数里面最大的连续和,要求算法时间复杂度尽可能低。
function max_sum_array($arr)
{
$currSum = 0;
$maxSum = 0;
$n = count($arr);
for ($i = 0; $i < $n; $i++) {
if ($currSum >= 0) {
$currSum += $arr[$i];
} else {
$currSum = $arr[$i];
}
}
if ($currSum > $maxSum) {
$maxSum = $currSum;
}
return $maxSum;
}
原文链接:http://coffeephp.com/articles/4