您的位置:首页 > 其它

鹅厂2016实习笔试程序题

2016-04-14 23:42 351 查看
本文两道程序题是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*
;
for(int i=0;i<n;i++)
a[i] = new int
;

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: