<?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>