C/C++程序员面试宝典-2
9. 关系数据库的范式
10. 数据库操作中的事务
事务的4个特性:
11. 数字矩阵的生成:
对应的代码如下:
#include <iostream>
#include <algorithm>
#include <iomanip>
#define print_arr2d(arr,N) {for(int i=0;i<N;i++){\
for(int j=0;j<N;j++)\
cout<<setw(3)<<arr[i][j];\
cout<<endl;\
}}
using namespace std;
/*
1 2 9 10 25
4 3 8 11 24
5 6 7 12 23
16 15 14 13 22
17 18 19 20 21
*/
void mat_1(){
const int N=5;
int arr[N][N];
int m=1;
for(int i=0;i<N;i++){
if(i&0x1){
for(int j=0;j<=i;j++)
arr[j][i]=m++;
for(int j=i-1;j>=0;j--)
arr[i][j]=m++;
}
else{
for(int j=0;j<=i;j++)
arr[i][j]=m++;
for(int j=i-1;j>=0;j--)
arr[j][i]=m++;
}
}
print_arr2d(arr,N);
}
/*
1 2 6 7 15
3 5 8 14 16
4 9 13 17 22
10 12 18 21 23
11 19 20 24 25
*/
void mat_2(){
const int N=5;
int a[N][N];
int m=1;
int K=0;
for(int i=0;i<N;i++,K++){
for(int j=0;j<=i;j++)
if(K%2==0)
a[K-j][j]=m++;
else
a[j][K-j]=m++;
}
for(int i=1;i<N;i++,K++){
for(int j=i;j<N;j++)
if(K%2==0)
a[K-j][j]=m++;
else
a[j][K-j]=m++;
}
print_arr2d(a,N);
}
/*
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
*/
void mat_3(){
const int N=6;
int a[N][N]={0};
int m=1;
int K=N/2;
if(N%2!=0)
a[K][K]=N*N;
for(int i=0;i<K;i++) {
for(int j=i;j<=N-1-i;j++)
a[i][j]=m++;
print_arr2d(a,N);
cout<<"================="<<endl;
for(int j=i+1;j<=N-1-i;j++)
a[j][N-1-i]=m++;
print_arr2d(a,N);
cout<<"================="<<endl;
for(int j=N-2-i;j>=i;j--)
a[N-1-i][j]=m++;
print_arr2d(a,N);
cout<<"================="<<endl;
for(int j=N-2-i;j>=i+1;j--)
a[j][i]=m++;
print_arr2d(a,N);
cout<<"================="<<endl;
}
print_arr2d(a,N);
}
/*
13 12 11 10 25
14 3 2 9 24
15 4 1 8 23
16 5 6 7 22
17 18 19 20 21
*/
void mat_4(){
const int N=6;
int a[N][N]={0};
int m=N*N;
int K=N/2;
if(N%2!=0)
a[K][K]=1;
for(int i=0;i<K;i++){
for(int j=i;j<=N-1-i;j++)
a[j][N-1-i]=m--;
for(int j=N-2-i;j>=i;j--)
a[N-1-i][j]=m--;
for(int j=N-2-i;j>=i;j--)
a[j][i]=m--;
for(int j=i+1;j<=N-2-i;j++)
a[i][j]=m--;
}
print_arr2d(a,N);
}
int main(){
mat_4();
}
#include <algorithm>
#include <iomanip>
#define print_arr2d(arr,N) {for(int i=0;i<N;i++){\
for(int j=0;j<N;j++)\
cout<<setw(3)<<arr[i][j];\
cout<<endl;\
}}
using namespace std;
/*
1 2 9 10 25
4 3 8 11 24
5 6 7 12 23
16 15 14 13 22
17 18 19 20 21
*/
void mat_1(){
const int N=5;
int arr[N][N];
int m=1;
for(int i=0;i<N;i++){
if(i&0x1){
for(int j=0;j<=i;j++)
arr[j][i]=m++;
for(int j=i-1;j>=0;j--)
arr[i][j]=m++;
}
else{
for(int j=0;j<=i;j++)
arr[i][j]=m++;
for(int j=i-1;j>=0;j--)
arr[j][i]=m++;
}
}
print_arr2d(arr,N);
}
/*
1 2 6 7 15
3 5 8 14 16
4 9 13 17 22
10 12 18 21 23
11 19 20 24 25
*/
void mat_2(){
const int N=5;
int a[N][N];
int m=1;
int K=0;
for(int i=0;i<N;i++,K++){
for(int j=0;j<=i;j++)
if(K%2==0)
a[K-j][j]=m++;
else
a[j][K-j]=m++;
}
for(int i=1;i<N;i++,K++){
for(int j=i;j<N;j++)
if(K%2==0)
a[K-j][j]=m++;
else
a[j][K-j]=m++;
}
print_arr2d(a,N);
}
/*
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
*/
void mat_3(){
const int N=6;
int a[N][N]={0};
int m=1;
int K=N/2;
if(N%2!=0)
a[K][K]=N*N;
for(int i=0;i<K;i++) {
for(int j=i;j<=N-1-i;j++)
a[i][j]=m++;
print_arr2d(a,N);
cout<<"================="<<endl;
for(int j=i+1;j<=N-1-i;j++)
a[j][N-1-i]=m++;
print_arr2d(a,N);
cout<<"================="<<endl;
for(int j=N-2-i;j>=i;j--)
a[N-1-i][j]=m++;
print_arr2d(a,N);
cout<<"================="<<endl;
for(int j=N-2-i;j>=i+1;j--)
a[j][i]=m++;
print_arr2d(a,N);
cout<<"================="<<endl;
}
print_arr2d(a,N);
}
/*
13 12 11 10 25
14 3 2 9 24
15 4 1 8 23
16 5 6 7 22
17 18 19 20 21
*/
void mat_4(){
const int N=6;
int a[N][N]={0};
int m=N*N;
int K=N/2;
if(N%2!=0)
a[K][K]=1;
for(int i=0;i<K;i++){
for(int j=i;j<=N-1-i;j++)
a[j][N-1-i]=m--;
for(int j=N-2-i;j>=i;j--)
a[N-1-i][j]=m--;
for(int j=N-2-i;j>=i;j--)
a[j][i]=m--;
for(int j=i+1;j<=N-2-i;j++)
a[i][j]=m--;
}
print_arr2d(a,N);
}
int main(){
mat_4();
}
12. 大数乘法问题:
#include <string>
#include <iostream>
using namespace std;
string big_multi(const string& x,
const string& y){
int szx=x.size();
int szy=y.size();
int *C=new int[szx+szy+1]();
for(int i=szx-1,k=0;i>=0;i--,k++){
int carry=0;
int m=k;
for(int j=szy-1;j>=0;j--,m++){
int val=(x[i]-'0')*(y[j]-'0')+carry+C[m];
C[m]=val%10;
carry=val/10;
}
if(carry!=0)
C[m]=carry;
}
string z;
int i=szx+szy;
while(C[i]==0)
i--;
for(;i>=0;i--)
z+=(char)(C[i]+'0');
delete C;
return z;
}
int main(){
int a=78,b=42;
string x="78",y="42";
string z=big_multi(x,y);
cout<<z<<" "<<a*b<<endl;
}
#include <iostream>
using namespace std;
string big_multi(const string& x,
const string& y){
int szx=x.size();
int szy=y.size();
int *C=new int[szx+szy+1]();
for(int i=szx-1,k=0;i>=0;i--,k++){
int carry=0;
int m=k;
for(int j=szy-1;j>=0;j--,m++){
int val=(x[i]-'0')*(y[j]-'0')+carry+C[m];
C[m]=val%10;
carry=val/10;
}
if(carry!=0)
C[m]=carry;
}
string z;
int i=szx+szy;
while(C[i]==0)
i--;
for(;i>=0;i--)
z+=(char)(C[i]+'0');
delete C;
return z;
}
int main(){
int a=78,b=42;
string x="78",y="42";
string z=big_multi(x,y);
cout<<z<<" "<<a*b<<endl;
}
13. 递归的方法将两个有序链表进行合并