利用PHP實現《劍指 offer》之字符串(數據結構與算法實戰)

必定要認真看 分析 | 註釋 | 題目要求

Question 1

題目描述:
HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同窗。今天測試組開完會後,他又發話了:在古老的一維模式識別中,經常須要計算連續子向量的最大和,當向量全爲正數的時候,問題很好解決。可是,若是向量中包含負數,是否應該包含某個負數,並指望旁邊的正數會彌補它呢?例如:{6,-3,-2,7,-15,1,2,2},連續子向量的最大和爲8(從第0個開始,到第3個爲止)。你會不會被他忽悠住?(子向量的長度至少是1)php

分析:
這是典型的動態規劃問題 詳見動態規劃
第一種方法採用了狀態轉移方程(我也搞不太清楚)
第二種方法更爲形象
代碼以下:html

<?php

function FindGreatestSumOfSubArray($array)
{
    // write code here
    if($array == null){
        return 0;
    }
    $max = $array[0];
    $res = $array[0];
    for($i=1;$i<count($array);$i++){
        $max = max($max+$array[$i],$array[$i]);
        $res = max($res,$max);
    }
    return $res;
}



/**
* Thinking: 
        假設第一個值爲最大值,再初始化一個動態值(持續加的過程,值一直在變化),若是這個動態值爲負數,則動態值重置爲當前數值(由於當前數值不管是正是負再加上一個負值只會更小),反之則連加,再將動態值與最大值比較,將較大者賦給最大值。
*/
function FindGreatestSumOfSubArray($array)
{
    if(count($array) == 0 || $array == null){
        return 0;
    }
    $greateSum = $array[0];
    $curSum    = 0;

    $len = count($array);
    for($i = 0; $i < $len; $i++){
        if($curSum <= 0){
            $curSum = $array[$i];
        }
        else{
            $curSum += $array[$i];
        }
        if($curSum > $greateSum){
            $greateSum = $curSum;
        }
    }

    return $greateSum;
}

測試地址:https://www.nowcoder.com/prac...正則表達式

Question 2

題目描述:
輸入一個字符串,按字典序打印出該字符串中字符的全部排列。例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的全部字符串abc,acb,bac,bca,cab和cba。數組

分析:
利用哈希表 每一個字符的ASCII碼做爲key函數

注1:哈希查找經常用於查找一個指定值相等的記錄 而不須要比較
注2: 如下函數不爲全排列(即不包括字符重複的狀況)

代碼以下:測試

<?php

/**
* @param $ar Array
* @param $k  int  出發序號
* @param $m  int  數組單元個數
*/
function perm(&$ar, $k=0, $m) {
    if($k == $m){ 
        echo join('',$ar), PHP_EOL;
    }else{
        for($i=$k; $i<=$m; $i++) {
            swap($ar[$k], $ar[$i]);
            perm($ar, $k+1, $m);
            swap($ar[$k], $ar[$i]);
        }
    }
}

function swap(&$a, &$b){
    $c = $a;
    $a = $b;
    $b = $c;
}

測試地址:https://www.nowcoder.com/prac...3d

Question 3

題目描述:
請實現一個函數用來判斷字符串是否表示數值(包括整數和小數)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示數值。 可是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。code

分析:
正則表達式htm

注:測試經過率不足100% 在此只提供一種思路

代碼以下:字符串

<?php

function isNumeric($s)
{
    // write code here
    $pattern = "/[\\+-]?[0-9]*(\\.[0-9]*)?([eE][\\+-]?[0-9]+)?/";
    return preg_match($pattern,$s);
}

測試地址:https://www.nowcoder.com/prac...

Question 4

題目描述:
將一個字符串轉換成一個整數,要求不能使用字符串轉換整數的庫函數。 數值爲0或者字符串不是一個合法的數值則返回0

分析:
符號 數字
代碼以下:

<?php

function StrToInt($str)
{
    // write code here
    $tem = array('1','2','3','4','5','6','7','8','9','0');  #預約義組成數字的元素數組
    $len = strlen($str);
    if($len == 0)return 0;
    $arr = str_split($str); #將字符串轉換爲數組

    $fuhao = 0;
    if($arr[0] == '-'){
        $fuhao = 1;
    }
    
    $sum = 0;
    for($i = $fuhao; $i<$len; $i++){
        if($arr[$i] == '+'){
            continue;
        }
        if(!in_array($arr[$i],$tem)){
            return 0;
        }
        $sum = $sum*10 + $arr[$i];
    }
    return $fuhao == 0 ? $sum : -1*$sum;
}

測試地址:https://www.nowcoder.com/prac...

相關文章
相關標籤/搜索