騰訊2016校招編程題PHP實現(xiàn)

文/michael

作為一個還沒找到工作的大三狗來說,校招無疑是最好的,也是最后的機(jī)會,對于BAT,大家肯定也是削尖了腦袋往里鉆的。這必須付出必別人更多的努力才行的。

2016騰訊春招的編程題

話不多說,直接上題

  • 給定一個字符串s,你可以從中刪除一些字符,使得剩下的串是一個回文串。如何刪除才能使得回文串最長呢?輸出需要刪除的字符個數(shù) 。

這道題是以回文為載體,考察兩個字符間的最大子串,最大子串算法在表示字符串的關(guān)聯(lián)度上用途很廣泛。
而遮到題就是字符串的長度減去其和翻轉(zhuǎn)字符串的長度的最大子串即可。最長子串的算法我一開始也是蒙的。這完全沒沒思路呀。。
后來看到一篇blog,才明白最長子串,好的,最后我們形成代碼

function solution ($str){
        $res=strrev($str);
        $len=strlen($str);
        $data=array();
        for ($i = 0; $i < $len; $i++) 
            for($j=0 ; $j< $len;$j++){
                    $data[$i][$j]= 0; 
                }
                //開始查找
        for($i=1;$i<$len+1;$i++){
            for($j=1;$j<$len+1;$j++){
                if($str[$i-1] == $res[$j-1]){
                    $data[$i][$j]=$data[$i-1][$j-1] +1;
                }
                else if($data[$i-1][$j] >= $data[$i][$j-1]){
                    $data[$i][$j] = $data[$i-1][$j];
                } 
                else{
                    $data[$i][$j] = $data[$i][$j-1]; 
                }
            }
        }
        print_r($data);
        //其中$data[$len][$len]j即為最大子串
        return $len - $data[$len][$len];
}
//echo  solution('google');
  • 把一個字符串的大寫字母放到字符串的后面,各個字符的相對位置不變,且不能申請額外的空間。

這道題感覺上必上題好理解一點(diǎn),起碼自己腦袋里面有個大概的概念,請注意是不能再申請空間(即使是數(shù)組+1),所以要求我們在整個array中進(jìn)行遍歷。基本思路是先找出大寫字母的后一個字母,若是小寫就交換,大寫就記錄下位子,指針再后移,直到是小寫字母為止,然后遍歷交換元素位子,指針是永遠(yuǎn)指向第一個大寫字母的。

function solution2($str){
        function  checkcase($s){
                if(preg_match('/^[a-z]+$/', $s)){
                        return 1;
                    }else if(preg_match('/^[A-Z]+$/', $s)){
                                return 2;
                    }
            }
            for($i=0;$i<strlen($str);$i++){
                if(checkcase($str[$i]) ==2){
                    for($j=$i+1;$j<strlen($str);$j++){
                        $t=$j;
                        if(checkcase($str[$j]) ==1){
                            for($l=$t;$l>=$i+1;$l--){
                                $tem=$str[$l];
                                $str[$l]=$str[$l-1];
                                $str[$l-1]=$tem;
                            }
                            break;
                        }
                        else{
                                //echo $j.','.$t;
                        }
                    }
                }
                
            }
            return $str;
    }
    echo solution2("AkleBiCeilD");
  • 蛇形矩陣作為一種常用的數(shù)學(xué)數(shù)列,是由1開始的自然數(shù)一次排列成的一個N*N的正方形矩陣,數(shù)字一次由外而內(nèi)的遞增,輸入蛇形矩陣寬度N,輸出整個蛇形矩陣結(jié)果,注意輸出格式要求按照矩陣從上至下的依次按行輸出,每行中間無需換行輸出。eg:樣本輸入: 3樣本輸出: 1 2 3 8 9 4 7 6 5

直接按照上、右、下、左的順序進(jìn)行遍歷,計算好遍歷層數(shù)就OK了.我們可以拓展到n行,m列的蛇形矩陣,其中有個規(guī)律就是遍歷的層數(shù),為(行數(shù)+1)/2的向下取整。記住這個,然后細(xì)心再細(xì)心就好。

function snake($row = 3, $col = 3){
    $res = array();
    // 初始值
    $start = 1;
    // 當(dāng)前遍歷層數(shù)
    $flag = intval(($row + 1) / 2);

    for ($i = 1; $i <= $flag; $i++) { 
        $startx = $i - 1;
        $starty = $i - 1;
        $width = $col - $i + 1;
        $height = $row - $i + 1;
        // 上
        for ($u = $starty; $u < $width; $u++) { 
            $res[$startx][$u] = $start;
            $start += 1;
        }
        // 右
        for ($r = $startx + 1; $r < $height; $r++) { 
            $res[$r][$u-1] = $start;
            $start += 1;
        }
        // 下
        for ($d = $u - 1 - 1; $d >= $starty; $d--) { 
            $res[$r-1][$d] = $start;
            $start += 1;
        }
        // 左
        for ($l = $r - 1 - 1; $l >= $startx + 1; $l--) { 
            $res[$l][$d+1] = $start;
            $start += 1;
        }

    }

    // 輸出
    for ($i = 0; $i < $row; $i++) { 
        for ($j = 0; $j < $col; $j++) { 
            echo $res[$i][$j] . " ";
        }
    }

}

snake();
時間復(fù)雜度

首先列出時間復(fù)雜度。第一個是O(n^2)這沒啥說的。
第二個是說白了就是個冒泡的,但最里層嵌套是和大寫字母的個數(shù)m有關(guān)系,所以為(n*m)。
第三個我看了半天,應(yīng)該是O(n)吧,要是不對,歡迎大家指正。

總結(jié)

以前的我天真的認(rèn)為只要在大學(xué)期間做足夠的項目經(jīng)驗,就可以找到份不錯的工作,我承認(rèn)我并不是像一些真正的大牛,對program抱有極大的興趣。這點(diǎn)很重要,我們學(xué)生時代的項目再多,大多數(shù)是寫業(yè)務(wù)邏輯。并不能接觸到算法和架構(gòu)等高端的應(yīng)用場景,而大公司可以!

最后祝大家,也祝我,在校招之即找到份合適的工作!!!fighting!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容