題目: PHP 實現連續子數組的最大和
描述:
HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同學。
今天測試組開完會后,他又發話了:在古老的一維模式識別中,
常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。
但是,如果向量中包含負數,是否應該包含某個負數,并期望旁邊的正數會彌補它呢?
例如:
{6,-3,-2,7,-15,1,2,2},連續子向量的最大和為8(從第0個開始,到第3個為止)。
你會不會被他忽悠住?(子向量的長度至少是1)
<?php
function FindGreatestSumOfSubArray($array)
{$sum = $array[0];$max = $sum;for($i = 1;$i<count($array);$i++){if($sum<0){$sum = $array[$i];}else {$sum += $array[$i];}if($sum>$max){$max = $sum;}}return $max;
}
題目: PHP 實現整數中1出現的次數(從1到n整數中1出現的次數)?
描述:
求出1~13的整數中1出現的次數,并算出100~1300的整數中1出現的次數?
為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對于后面問題他就沒轍了。
ACMer希望你們幫幫他,并把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數。
<?phpfunction NumberOf1Between1AndN_Solution($str)
{settype($str, 'string');if ($str == 0 || strlen($str) == 0) {return 0;}$first = $str[0];$numFirstDigit = 0;if ($first > 1) {$numFirstDigit = powerBase10(strlen($str) - 1);} else {$numFirstDigit = substr($str, 1) + 1;}$numOtherDigits = $first * (strlen($str)-1) * powerBase10(strlen($str)-2);$numRecursive = NumberOf1Between1AndN_Solution(substr($str, 1));return $numFirstDigit + $numOtherDigits + $numRecursive;
}function powerBase10($number) {return pow(10, $number);
}