注:大三快结束了,忙着找实习,参加了金山网络实习生校园招聘,3乘5实在是太难了,找实习也是太难了。。。
自己给出了些解答,有不对之处请大家指教。
题目只有四道,全是编程题。
1.用C++代码实现String类,要求:1)构造函数和析构函数;2)字符串连接函数;3)字符转化成小写函数;4)不区分大小写的比较函数。
要求不能用C字符串的库函数
class String {
public:
String(const char *str = NULL);
~String(void);
const char* Append(const char*str);
const char*ToLow(void);
int CompareCaseInsensitive(const char*str);
private:
char*m_data;//保存字符串
}
2.求出将1元,5元,10元,20元凑成n(n>50)的方法的个数,并输出组合结果。
3.判断字符串A是否可以由字符串B循环移位得到,如:ABCD可以由CDAB循环移位得到
4. 7
3 3
8 1 0
2 7 4 1
4 5 2 6 5
输出为:从顶端开始,沿着左斜下方或右斜下方走,走到低端的最长路径是多少。
第1题将类实现放在文件String.cpp中,声明放在String.h文件
#include "String.h"
short strlen(const char* str){
short len = 0;
if(str==NULL){
return 0;
}
else{
while(*str++ !='\0')
len++;
return len;
}
}
char* strcpy(char*dest,const char*src){
char* str = dest;
if(NULL==dest||NULL==src){
return NULL;
}
while(*dest++ = *src++ !='\0');
return str;
}
char* strcat(char*s1,const char*s2){
char* str = s1;
if(NULL==s2){
return str;
}
bool startcpy = false;
while(true){
if(*s1 == '\0'){
startcpy = true;
}
if(startcpy){
*s1++ = *s2++;
if(*s2 == '\0'){
*s1 = *s2;
break;
}
}
else{
*s1++;
}
}
return str;
}
String::String(const char *str = NULL){
if(str==NULL){
m_data = new char[1];
m_data[0] = '\0';
}
else{
m_data = new char[strlen(str)+1];
strcpy(m_data,str);
}
}
String::~String(void){
delete []m_data;
}
String::char* Append(const char*str){
short flag = strlen(str)+strlen(m_data)+1;
char*temp = m_data;
//重新给m_data分配内存
m_data = new char[flag];
strcpy(m_data,temp);
strcat(m_data,str);
//释放原来m_data的内存
delete temp;
return m_data;
}
String::char* ToLow(void){
for(int i = 0;i=65&&m_data<=90)
{
m_data[i] += ('a' - 'A');
}
}
return m_data;
}
int compute(const int n)
{
int count = 0;
if(n<=50){
printf("the number should be larger than 50\n");
exit 0;
}
for(int i = 0;i<=n/20;i++){
for(int j = 0;j<=n/10;j++){
for(int k = 0;k<=n/5;k++){
for(int p = 0;p<=n;++){
int temp = 20*i + 10*j + 5*p +k;
if(temp==n){
count++;
printf("20$: %d 10$: %d 5$: %d 1$: %d",i,j,k,p);
}
}
}
}
}
}
第3题代码网上很多,就不写了
第4题代码
#include
using namespace std;
int min(int a,int b){
return a < b? a:b;
}
short max(short a,short b){
return a>b?a:b;
}
int main(){
const short low = 5;
const short line = 9;
short maxLength = 0;//保存最长路径
short list[5][9] = {
{-1,-1,-1,-1,7,-1,-1,-1,-1},
{-1,-1,-1,3,-1,3,-1,-1,-1},
{-1,-1,8,-1,1,-1,0,-1,-1},
{-1,2,-1,7,-1,4,-1,4-1},
{4,-1,5,-1,2,-1,6,-1,5}};
short dp[5][9]={{-1,-1,-1,-1,5,-1,-1,-1,-1}};//初始化第一行的dp数组
for(short i = 1;i8){
dp[i][j] = dp[i-1][j-1] + list[i][j];
}
else{
dp[i][j] = max(dp[i-1][j-1],dp[i-1][j+1]) + list[i][j];
}
if(i == 4){
maxLength = max(maxLength,dp[i][j]);
cout<