PHP小小算法(Continuously updated)

将一个十进制数转换为36进制【0-9a-z】

<?php
$arr = [0,1,2,3,4,5,6,7,8,9,'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
$index = 36;
echo fn($index);
//10
function fn($index){
    global $arr;
    $len = sizeof($arr);
    $res = '';
    $m = 0;
    $n = 0;
    do{
        $m = floor($index/$len);
        $n = $index%$len;
        $res = $arr[$n].$res;
        $index = $m;
    }while($index);
    return $res;
}

如果你有10块钱,2块钱可以买一瓶酒,两个酒瓶可以换一瓶酒,四个啤酒盖可以换一瓶酒,问可以喝多少瓶酒,还剩余多少个
啤酒瓶和啤酒盖?

<?php
$money = 10;
$have_bootle;
$have_cap;
$all = floor($money/2);
$bottle = $all;
$cap = $all;

echo drink($all,$all)+$all;
//15
echo '</br>';
echo '剩余酒瓶数量: '.$have_bootle.'   剩余瓶盖数量: '.$have_cap;
//1 - 3
//若借5瓶酒,可以全部抵消
function drink($num_bottle,$num_cap)
{
    global $have_cap,$have_bootle;
    $bottle = $num_bottle;
    $cap = $num_cap;
    if($bottle>=2 || $cap >=4){
        $have_bootle = floor($bottle/2)+$bottle%2+floor($cap/4);
        $have_cap = floor($cap/4)+$cap%4+floor($bottle/2);
        return floor($bottle/2)+floor($cap/4)+drink($have_bootle,$have_cap);
    }
}

给定一组排好序的数组[1-54],将该数组乱序

<?php
$temp = 0;
$arr = range(1,54);
echo implode(',',$arr).PHP_EOL;
$index = $length = sizeof($arr)-1;
for(;$index>=0 ;$index--){
    $rand = rand(0,$length);
    $temp = $arr[$rand];
    $arr[$rand] = $arr[$index];
    $arr[$index] = $temp;
}
echo implode(',',$arr);

有一个乱序的数组,给出数组中的一个值,求其键key

<?php
$temp = 0;
$arr = range(1,10);
$index = $length = sizeof($arr)-1;
for(;$index>=0 ;$index--){
    $rand = rand(0,$length);
    $temp = $arr[$rand];
    $arr[$rand] = $arr[$index];
    $arr[$index] = $temp;
}
print_r($arr);

$val = $arr[rand(0,sizeof($arr)-1)];
echo 'value: '.$val.PHP_EOL;
$reverseArr = array_flip($arr);
echo 'key: '.$reverseArr[$val];
//这里使用了一个php内置函数,并不是通用方法,若有更好的通用算法,欢迎留言讨论,当然一个for循环一个个比较就不说了。

有一个重复数据的数组,找出重复值

<?php
//查找重复元素
function fn($arr){
    $temp = array();
    $repeat = array();
    foreach($arr as $v){
        if($temp[$v] && $temp[$v] != 2){
            $repeat[] = $v;
            $temp[$v] = 2;
        }else{
            $temp[$v] = 1;
        }
    }
    return $repeat;
}

//不能获得单个重复值
function fn1($array) {
    // 获取去掉重复数据的数组
    $unique_arr = array_unique ( $array );
    // 获取重复数据的数组
    $repeat_arr = array_diff_assoc ( $array, $unique_arr );
    return $repeat_arr;
}

function fn2($arr)
{
    if(!is_array($arr)) return $arr;
    $arr1 = array_count_values($arr);
    $newArr = array();
    foreach($arr1 as $k=>$v)
    {
        if($v>1) array_push($newArr,$k); 
    }
    return $newArr;
}

function fn3($arr)
{
    if(!is_array($arr)) return $arr;
    $arr1 = array_unique($arr);
    $arr3 = array_diff_key($arr,$arr1); 
    return array_unique($arr3);
}



$arr = array('apple','blue','red','banana','pear','apple','blue','color','color','color');
print_r(fn($arr));
//以下三个都使用到了php内置函数
print_r(fn1($arr));
print_r(fn2($arr));
print_r(fn3($arr));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值