代码片段3

二进制求和,给定两个二进制字符串,返回他们的和(用二进制表示)。

class Solution
{

    /**
     * @param String $a
     * @param String $b
     * @return String
     */
    function addBinary($a, $b)
    {
        $a_len = strlen($a);
        $b_len = strlen($b);
        $len = max($a_len, $b_len);
        $re = [];
        $pre = 0;
        for ($i = 0; $i < $len; $i++) {
            $a_index = $a_len - $i - 1;
            $b_index = $b_len - $i - 1;

            $_a = $a_index < 0 ? 0 : $a[$a_index];
            $_b = $b_index < 0 ? 0 : $b[$b_index];
            $sum = $_a + $_b + $pre;
            $pre = floor($sum / 2);
            array_unshift($re, $sum % 2);
        }
        if ($pre > 0) {
            array_unshift($re, $pre);
        }
        return implode('', $re);
    }
}

实现 strStr() 函数。

给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。

class Solution {

    /**
     * @param String $haystack
     * @param String $needle
     * @return Integer
     */
    function strStr($haystack, $needle) {
        if($needle == ''){
            return 0;
        }
        $h_len = strlen($haystack);
        $n_len = strlen($needle);
        if($n_len > $h_len){
            return -1;
        }
        
        for($i=0;$i<=$h_len-$n_len;$i++){
            if(substr($haystack, $i, $n_len) == $needle){
                return $i;
            }
        }
        return -1;
    }
}

编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。

class Solution {

    /**
     * @param String[] $strs
     * @return String
     */
    function longestCommonPrefix($strs) {
        if(empty($strs)){
            return '';
        }

        $prefix = $strs[0];
        for ($i = 1; $i < count($strs); $i++){
            while (strpos($strs[$i],$prefix) === false) {
                $prefix = substr($prefix, 0, strlen($prefix) - 1);
                if ($prefix == '') 
                    return "";
            }
        }
        return $prefix;
    }
}

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

class Solution {

    /**
     * @param String[] $s
     * @return NULL
     */
    function reverseString(&$s) {
        $count = count($s);
        $half = floor($count/2);
        for($i=0; $i<$half; $i++){
            /*$a = $s[$i];
            $s[$i] = $s[$count-$i-1];
            $s[$count-$i-1] = $a;*/
            list($s[$i],$s[$count-$i-1]) = [$s[$count-$i-1],$s[$i]];
        }
        return $s;
    }
}

给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大。

思路:排序,求和

class Solution {
    /**
     * @param Integer[] $nums
     * @return Integer
     */
    function arrayPairSum($nums) {
        sort($nums,SORT_NUMERIC);
        $sum = 0;
        for($i=0;$i<floor(count($nums)/2);$i++){
            $sum += $nums[$i*2];
        }
        return $sum;
    }
}

给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。

输入: numbers = [2, 7, 11, 15], target = 9
输出: [1,2]
解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
class Solution {

    /**
     * @param Integer[] $numbers
     * @param Integer $target
     * @return Integer[]
     */
    function twoSum($numbers, $target) {
        $arr = [];
        foreach($numbers as $k => $v){
            if(isset($arr[$v])){
                return [$arr[$v],$k+1];
            }
            $arr[$target-$v] = $k+1;
        }
        return [];
    }
}

所有原创文章采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。
您可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。
本站部分内容收集于互联网,如果有侵权内容、不妥之处,请联系我们删除。敬请谅解!

  Previous post 代码片段2
Next post   记录1

添加新评论

日历
2019 11
    123
45678910
11121314151617
18192021222324
252627282930 

  关于博主

  近期评论

  • 暂无评论

青春就是用来追忆的,当你怀揣着它时,它一文不值,只有将它耗尽后,再回过头看,一切才有了意义,爱过我们的人和伤害过我们的人,都是我们青春存在的意义。

既然活着来到这个世界,就没有打算活着回去。所以,在这有限的时间里,我们应该珍惜生命,珍惜机会,更要珍惜那得之不易的时间。因那滴答做响的时间脚步,一旦走过,再不回头。

青春是一个充满魁力,充满诱惑的时代。好动是青春,好奇是青春,好玩是青春。玩世不恭更是青春,我们的一切切都是青春。

要先打败任何事情得先学会打败自己。

我会把每一次改变当做成长,哪怕是痛也值得。