PHP 算法题

给定一个数组 arr,包含 n 个整数
再给定一个整数 k,可以给数组中任意整数加 1,总共可以加 k 次
加完 k 次后,找到数组中的最大值。最后要求得一个最小的最大值

public function arith1($arr, $k)
    {
        $diff = 0;
        $max = max($arr);
        $count = count($arr);
        foreach ($arr as $v) {
            $diff += $max - $v;
        }
        if ($diff > $k) {
            return $max;
        } else {
            return $max + ceil(($k - $diff) / $count);
        }
    }
$arr = [1,4,5,9,21,17]; $k = 93;
echo arith1($arr,$k)

有重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合
示例:输入:S = “qqe” 输出:[“eqq”,“qeq”,“qqe”]

public function arith2($s, $s2 = '')
    {
        $len = strlen($s);
        if ($len <= 1) {
            echo $s2 . $s . '<br>';
        } else {
            for ($i = 0; $i < $len; $i++) {
                $lin = str_replace($s[$i], '', $s);
                $this->arith2($lin, $s2 . $s[$i]);
            }
        }
    }
$str = 'abc';
print_r(arith2($str))

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target
写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1

public function arith3($num, $target)
    {
        $left = 0;
        $right = count($num) - 1;
        while ($left <= $right) {
            $mid = ceil($left + ($right - $left) / 2);
            if ($num[$mid] == $target) {
                return $mid;
            } elseif ($num[$mid] < $target) {
                $left = $mid + 1;
            } elseif ($num[$mid] > $target) {
                $right = $mid - 1;
            }
        }
        return -1;
    }
 $arr = [2,4,16,16,17,23];
 $target = 16;
 echo arith3($arr,$target) 
    

给定一个整数数组 nums 和一个整数目标值 target
请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标

 public function arith4($arr, $num)
    {
        for ($i = 0; $i < count($arr) - 1; $i++) {
            for ($j = $i + 1; $j < count($arr); $j++) {
                if ($arr[$i] + $arr[$j] == $num) {
                    return [$i, $j];
                } else {
                    continue;
                }
            }
        }
        return false;
    }
$arr = [2,4,14,16,17,23]; 
$target = 200;
print_r(arith4($arr,$target))

给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai)
在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水

public function arith5($arr)
    {
        $x = 0;
        $y = count($arr) - 1;
        $S = 0;
        while ($x < $y) {
            $tmp = min($arr[$x], $arr[$y]) * ($y - $x);
            $S = max($S, $tmp);
            if ($arr[$x] < $arr[$y]) {
                ++$x;
            } else {
                --$y;
            }
        }
        return $S;
    }
$arr = [1,8,6,2,5,4,8,9,6];
echo  arith5($arr);

给你一个字符串 str,找到 str 中最长的回文子串;例如: 输入ascbbcfcb , 输出bcfcb

public function arith6($str)
    {
        $len = strlen($str);
        $res = '';
        for ($i=0;$i<$len-2;$i++){
            for ($j=$i+2;$j<=$len;$j++){
                $tmp = substr($str,$i,$j-$i);
                if ($tmp==strrev($tmp)){
                    if (strlen($tmp)>strlen($res)) {
                        $res = $tmp;
                    }
                }
            }
        }
        return $res;
    }
   
$str = 'abcdefedcfggggggfc';
echo arith6($str);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值