本文两道程序题是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;
}
题目:输入一个整数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;
}