腾讯2016校招编程题【PHP实现】

2016腾讯春招的编程题

话不多说,直接上题!!!

  • 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?输出需要删除的字符个数 。
这道题是以回文为载体,考察两个字符间的最大子串,最大子串算法在表示字符串的关联度上用途很广泛。
而遮到题就是字符串的长度减去其和翻转字符串的长度的最大子串即可。最长子串的算法我一开始也是蒙的。这完全没没思路呀。
后来看到一篇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‘);
  • 把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。
这道题感觉上必上题好理解一点,起码自己脑袋里面有个大概的概念,请注意是不能再申请空间(即使是数组+1),所以要求我们在整个array中进行遍历。基本思路是先找出大写字母的后一个字母,若是小写就交换,大写就记录下位子,指针再后移,直到是小写字母为止,然后遍历交换元素位子,指针是永远指向第一个大写字母的。

  代码实现:

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");
  • 蛇形矩阵作为一种常用的数学数列,是由1开始的自然数一次排列成的一个N*N的正方形矩阵,数字一次由外而内的递增,输入蛇形矩阵宽度N,输出整个蛇形矩阵结果,注意输出格式要求按照矩阵从上至下的依次按行输出,每行中间无需换行输出。eg:样本输入: 3样本输出: 1 2 3 8 9 4 7 6 5
直接按照上、右、下、左的顺序进行遍历,计算好遍历层数就OK了.我们可以拓展到n行,m列的蛇形矩阵,其中有个规律就是遍历的层数,为(行数+1)/2的向下取整。记住这个,然后细心再细心就好。

 代码实现:

function snake($row = 3, $col = 3){
    $res = array();
    // 初始值
    $start = 1;
    // 当前遍历层数
    $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();
时间复杂度:

首先列出时间复杂度。第一个是O(n^2)这没啥说的。

第二个是说白了就是个冒泡的,但最里层嵌套是和大写字母的个数m有关系,所以为(n*m)。
第三个我看了半天,应该是O(n)吧,要是不对,欢迎大家指正。

总结

以前的我天真的认为只要在大学期间做足够的项目经验,就可以找到份不错的工作,我承认我并不是像一些真正的大牛,对program抱有极大的兴趣。

这点很重要,我们学生时代的项目再多,大多数是写业务逻辑。并不能接触到算法和架构等高端的应用场景,而大公司可以!

时间: 2024-12-28 01:45:02

腾讯2016校招编程题【PHP实现】的相关文章

腾讯2016实习生编程题 打印蛇形二维数组

当时腾讯测评笔试的时候没有写出来,今天想想把这玩意给弄出来,想思路包括写程序大概用了20分钟,接着调试程序用了接近30分钟 根据这些情况,恩,给自己打75分.  调试过程中出现的异常主要是数组下标越界  就是循环过程,在边界条件下,中数组下标没有处理好 下面是我的code package test1; /* * 输入一个整数 输出一个矩阵 * 例子 整数等于3 * 矩阵为 1 2 3 * 8 9 4 * 7 6 5 *输出为 1 2 3 8 9 4 7 6 5 * 思路:首先确定有多少圈 就有多

JavaScript编程题(含腾讯2016校招题)

作者:ManfredHu 链接:http://www.manfredhu.com/2016/04/02/15-veryGoodForUsing/ 声明:版权所有,转载请保留本段信息,否则请不要转载 几道觉得挺有意思的编程题,感觉做下来,自己对一些新方法的看法有了新的变化. 比如indexOf,reduce,Array.isArray,forEach这些方法,以前一看到兼容性是IE9+就有点害怕,项目中不敢用,导致后面越来越陌生,不过现在一想的话.其实只要用Polyfill或者提前fix掉就可以了

微软校招编程题&quot;Beautiful String&quot;的状态机解法

昨天碰巧看到一道微软校招的编程题,题目大意如下: 如果一个字符串包括三组或者更多组的连续升序字母,每组长度相等,那么我们就称这个字符串是Beautiful String 如下是一些Beautiful String的例子: abc.cde.aabbcc.aaabbbccc 这些不是Beautiful String: abd.cba.aabbc.zab 输入一个只含有小写字母的字符串,如果它含有一个Beautiful的子串,就输出YES,否则输出NO 输入: 第一行是案例个数,之后的每一行是一个数字

网易秋招校招编程题

网易内推面试凉了,再战正式批笔试,选择和简答略难,编程题很良心,基本就是模拟.找规律,略加思考就能解出来的题目,本弱鸡只有在良心网易笔试才能AK. 1.翻转翻转 这题一开始没思路,ac了后两题后再回来思考,发现只需要判断某个位置周围有几个点,就代表了那个位置会被别的点翻转几次,那么如何求周围有几个点呢? 简单的把位置分成3类: 一类是四个顶点:每个顶点会被翻转4次(加上自己翻转一次). 第二类是四条边(不含顶点):边上的点会被翻转6次. 第三类就是中间部分:中间的每个点会被翻转9次. 因此翻转9

19届第四范式测试开发工程师校招-编程题

编程题两道,第一道关于SQL的联合查询跟第二排序,第二道关于二维数组. 题目2: 给定一个空的int类型的二维数组array[n][m].按下面的填充规则,请编写一个函数将此二维数组填满并打印出来. 1 2 4 7 3 5 8 11 6 9 12 14 10 13 15 16 输入描述:输入的包括两个正整数,表示二维数组的大小n,m(1<=n,m<=10) 输出描述:打印结果,每行行末无空格. 例1:输入为4 4 输出为 1 2 4 7 3 5 8 11 6 9 12 14 10 13 15

2016校招真题编程-懂二进制

题目描述 世界上有10种人,一种懂二进制,一种不懂.那么你知道两个int32整数m和n的二进制表达,有多少个位(bit)不同么? 输入例子: 1999 2299 输出例子: 7 解题思路:异或,除二取余 源代码: package SuperHakceMainPackage; import java.util.Scanner; public class SuperHakceMian { int countBitDiff(int n,int m){ return n ^ m; } int findN

大数乘法——2016开发实习生腾讯模拟笔试编程题

给出两个大数,用字符串模拟整型数字的乘法. #include<iostream> #include<string> using namespace std; char* MultiString(char* str1,char* str2){ int len1=strlen(str1),len2=strlen(str2); if(len2>len1){ //len1,str1对应较长的字符串 char* temp=str1; int temp1=len1; str1=str2;

2016校招真题之小球的距离

1.题目描述 小东和三个朋友一起在楼上抛小球,他们站在楼房的不同层,假设小东站的楼层距离地面N米,球从他手里自由落下,每次落地后反跳回上次下落高度的一半,并以此类推知道全部落到地面不跳,求4个小球一共经过了多少米?(数字都为整数) 给定四个整数A,B,C,D,请返回所求结果. 测试样例: 100,90,80,70 返回:1020 2.代码实现 1 package com.wcy.october; 2 3 /** 4 * 时间:2016年10月16日 题目:小球的距离 5 * 题目描述:小东和三个

携程2019校招编程题(3)

携程今年的机试题为20道选择+3编程 由于今天最后提交时第三题编程未通过,交卷之后想出来的解法这里记录一下. import java.util.ArrayList; import java.util.List; import java.util.Scanner; //携程3 public class LRU { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int size=Intege