几道算法解答

 

<?php

 

# 找出两数字的最大差距

function find_max_distance($A){

    if (empty($A)){

        return false;

    }

 

    $len = count($A);

    if ($len <= 1){

        return 0;

    }

 

    if ($A[0] > $A[1]){

        $min = $A[1];

        $max = $A[0];

    } else {

        $max = $A[1];

        $min = $A[0];

    }

 

    for($p=2, $q=3; $q < $len; ++$p, ++$q){

        if ($A[$p] > $A[$q]){

            $this_big = $A[$p];

            $this_small = $A[$q];

        } else {

            $this_big = $A[$q];

            $this_small = $A[$p];

        }

 

        if ($this_big > $max){

            $max = $this_big;

        }

        if ($this_small < $min){

            $min = $this_small;

        }

    }

 

    if ($p < $len){

        if ($A[$p] > $max){

            $max = $A[$p];

        } else if ($A[$p] < $min){

            $min = $A[$p];

        }

    }

 

    return $max - $min;

 

}

 

# k = k + A[k]

# 数组中访问不到的下标的个数

function count_not_visited($A){

    if (!is_array($A) || empty($A) || ($len = count($A)) == 1){

        return 0;

    }

 

    $visited_count = 0;

    $p = 0;

    while($p < $len && $p >= 0){

        ++$visited_count;

 

        $p = $p + $A[$p];

    }

 

    return $len - $visited_count;

}

 

# 最长连续递增子序列的起始下标

function find_start_index_of_longest_increase($A){

    if (!is_array($A) || empty($A)){

        return -1;

    }

 

    $len = count($A);

    if ($len <= 1){

        return 0;

    }

 

    $longest_len = 1;

    $longest_start = 0;

    $p = 0;

    $cur_start = 0;

    $cur_len = 1;

 

    $max_q = $len - 1;

    while($p < $max_q){

        if ($A[$p+1] > $A[$p]){ # 递增

            ++$cur_len;

        } else {

            if ($cur_len > $longest_len){

                $longest_len = $cur_len;

                $longest_start = $cur_start;

            }

 

            $cur_len = 1;

            $cur_start = $p + 1;

        }

 

        ++$p;

    }

 

    return $longest_start;

}

 

 

# 二进制相关

# 50 : 0b110010

# K1  : [1,4,5]

# 3 * 50 : 0b10010110

# K2  : [1,2,4,7]

# 返回K2中的元素个数

 

# $k , $b, $remain

#    !=      0    -> +=2

#    !=      1    -> +=0, r=1

#    ==      0    -> +=0, r=1

#    ==      1    -> +=1, r=1

function bit_count($K){

    if (!is_array($K) || empty($K)){

        return false;

    }

    $len = count($K);

 

    $B = array(0);

    foreach($K as $i){

        $B[] = $i + 1;

    }

 

    $count = 0;

    $i = 0;

    $remain = 0;

    while($i < $len){

        if ($K[$i] == $B[$i]){

            if (0 == $remain){

                $remain = 1;

            } else {

                $remain = 1;

                $count += 1;

            }

        } else {

            if (0 == $remain){

                $count += 2;

            } else {

                $remain = 1;

            }

        }

        ++$i;

    }

 

    return $count;

}

 

 

 

##################### 测试用例 ###########

 

$init_array = array(1, 2, 2, 4, 2, 4, 2, 2);

#var_dump(find_max_distance($init_array));

 

$init_array = array(1,2,3);

$init_array = array(3, -5, 0);

#var_dump(count_not_visited($init_array));

 

$init_array = array(1, 2, 2, 4, 5, 2, 4, 2, 2);

#var_dump(find_start_index_of_longest_increase($init_array));

 

$init_array = array(1, 2, 3);

var_dump(bit_count($init_array));

 

<script src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js" type="text/javascript"></script> <script src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js" type="text/javascript"></script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值