鹅厂2016实习笔试程序题

本文两道程序题是2016年4月腾讯的笔试题,当时只写出第二道,第一道关系搞的晕乎乎的。正好今天有时间,大概回忆了下题目,重新实现了一遍(可能和原题有点出路)。

1、最大回文长度

     题目大概意思是,输入一个字符串,返回最大子串长度,字串字符再原字符串可以不联系

     例如 cabbeaf,回文字串有  c、a、b、e、f、bb、aba、abba,最长的就是abba,长度4,最后输出4.

     

    解题思路:用两个指针,对于字符串,也就是两个下标,一个 i 从字符串开头往后走,一个 j 从字符串尾往前走。代码如下:

/*************************************************************************
	> File Name: longestplalindrome.cpp
	> Author   : BruceLv
	> Mail     : lvmaoxv@163.com 
	> Created Time: 2016年04月14日 星期四 20时15分52秒
 ************************************************************************/

#include<iostream>
#include<string>
using namespace std;

int longestplalindrome(string s)
{
    int n = s.length();
    if(n<=1)return n;
    int i,j,cnt=0,t=n-1;
    for(i=0;i<t;i++){
        for(j=t;j>i;){
            if(s[i]==s[j]){
                ++i;
                cnt++;
                t = --j;
            }
            else
                 --j;
        }
    }
    if(i-j==1)return 2*cnt+1;
    if(i-j==2) return 2*cnt;
    
}

int main()
{
    string s;
    while(getline(cin,s)){
        int n = longestplalindrome(s);
        cout<<n<<endl;
    }
    return 0;
}

上面代码好像还有问题,这里提供牛客网友提供的动态规划点击打开链接实现以供学习

#include<iostream>
#include <algorithm>
#include <string>
int dp[1000][1000];
using namespace std;
//思路就是求这个原字符串和它反转字符串的最长公共子序列  
int longestPlalindrome(string s)
{
	string str = s;
    reverse(str.begin(),str.end());
    int len=s.length();
    for(int i=1;i<=len;i++){
        for(int j=1;j<=len;j++){
            if(s[i-1]==str[j-1]){
                dp[i][j]=dp[i-1][j-1]+1;                             
            }
            else
                dp[i][j]=max(dp[i-1][j],dp[i][j-1]);                  
        }        
    }
    return dp[len][len];
}
int main()
{                 
    string str;
    while(cin>>str){
        int len = longestPlalindrome(str);
        cout<<len<<endl;
    }
    return 0;
}



2 、蛇形矩阵

    题目:输入一个整数N表示矩阵行列数,顺时针 从1 递增,一圈一圈往里转,生成矩阵,最后按行输出每个元素。。渣渣表达,直接看栗子
输入 :4

矩阵: 1     2    3   4

            12  13  14  5

            11  16  15  6

            10   9    8   7

输出:1  2  3  4  12  13  14  5  11  16  15  6  10  9  8  7

解题思路:这题相对简单一些,首先感觉输入的你 n 得到蛇形圈数 n/2 。然后一圈一圈顺时针往里转


/*************************************************************************
	> File Name: snakeMatrix.cpp
	> Author   : BruceLV 
	> Mail     : lvmaoxv@163.com 
	> Created Time: 2016年04月14日 星期四 23时08分59秒
 ************************************************************************/

#include<iostream>
using namespace std;

int main()
{
    int n;
    while(cin>>n){
        int x,y,r,cnt=1;
        int **a = new int*[n];
        for(int i=0;i<n;i++)
            a[i] = new int[n];
        
        if(n==1)a[0][0]=cnt;
        else{
            for(r=0;r<n/2;r++){
                x=r;  //行
                for(y=r;y<n-r;y++)
                    a[x][y]=cnt++;
                y=n-r-1;
                for(x=r+1;x<n-r-1;x++)
                    a[x][y]=cnt++;
                x=n-r-1;
                for(y=n-r-1;y>r;y--)
                    a[x][y]=cnt++;    
                y=r;
                for(x=n-r-1;x>r;x--)
                    a[x][y]=cnt++;            
                if(n%2) //如果n是奇数,补全中间空位
                    a[n/2][n/2]=cnt;
            }
        }        
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                cout<<a[i][j]<<" ";

        for(int i=0;i<n;i++)
            delete[] a[i];
        delete[] a;
    }
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值