# 面试常考算法题总结(一)

1
返回：["down"]

n = 1, size = 1： "down",
n = 2, size = 3:  "down", "down", "up"
n = 3, size = 7:  "down", "down", "up", "down", "down", "up", "up"

并取反即可得到。talk is cheap，show me the code：
class FoldPaper {
public:
vector<string> foldPaper(int n) {
vector<string> res;
if(n==1)
res.push_back("down");
else{
vector<string> v = foldPaper(n-1);
for(int i = 0;i<v.size();++i){
res.push_back(v[i]);
}
res.push_back("down");
reverse(v.begin(),v.end());
for(int i = 0;i<v.size();++i){
if(v[i]=="down")
res.push_back("up");
else
res.push_back("down");
}
}
return res;
}
};

class FoldPaper {
public:
vector<string> foldPaper(int n) {
// write code here
vector<string> vec;
pushs(vec,n,"down");
return vec;
}
//中序遍历程序
void pushs(vector<string> &vec,int n,string str)
{
if(n>0)
{
pushs(vec,n-1,"down");
vec.push_back(str);
pushs(vec,n-1,"up");
}
}
};

[[1,2],[3,4]],2,2
返回：[1,2,4,3]

class Printer {
public:
void clockwisePrint(const vector<vector<int>> &mat,vector<int> &res,int row1,int col1,int row2,int col2){
//左上角（row1,col1)右下角（row2,col2)
int i = row1,j=col1;
while(j<=col2)   //上一行向右
res.push_back(mat[i][j++]);
--j,++i;
while(i<=row2)   //右一行向下
res.push_back(mat[i++][j]);
--i,--j;
if(row1 == row2 || col1 == col2) //只又一列或一行时，不向左，也不向上
return;
while(j>=col1)  //下一行向左
res.push_back(mat[i][j--]);
++j,--i;
while(i>row1)   //左一行向上，不打印左上角
res.push_back(mat[i--][j]);
}
vector<int> clockwisePrint(vector<vector<int> > mat, int n, int m) {
int row1,row2,col1,col2;
std::vector<int> res;
for(row1 = 0,col1=0,row2=n-1,col2=m-1;row1<=row2 && col1<=col2;row1++,col1++,row2--,col2--)
clockwisePrint(mat,res,row1,col1,row2,col2);
return res;
}
};

[[1,2,3],[4,5,6],[7,8,9]],3
返回：[[7,4,1],[8,5,2],[9,6,3]]

class Rotate {
public:
vector<vector<int> > rotateMatrix(vector<vector<int> > mat, int n) {
vector<vector<int> > vmat(n,vector<int>(n,0));
for(int i = 0;i<n;++i){
for(int j = 0;j<n;++j)
vmat[i][j] = mat[n-1-j][i];
}
return vmat;
}
};


[[1,2,3],[4,5,6],[7,8,9],[10,11,12]],4,3
返回：[1,2,3,6,5,4,7,8,9,12,11,10]

class Printer {
public:
vector<int> printMatrix(vector<vector<int> > mat, int n, int m) {
vector<int> res;
int i = 0;
while(i<n){
if(i%2==0){
for(int j = 0;j<m;++j)
res.push_back(mat[i][j]);
}
else{
for(int j = m-1;j>=0;--j)
res.push_back(mat[i][j]);
}
++i;
}
return res;
}
};

"ABCDEFGH",8,4
返回："FGHABCDE"

class StringRotation {
public:
string rotateString(string A, int n, int p) {
return A.substr(p+1)+A.substr(0,p+1);
}
};

#### 对于一个字符串，设计一个算法，将包括i位置在内的左侧部分移动到右边，将右侧部分移动到左边。给定字符串A和它的长度n以及特点位置p，请返回旋转后的结果。

2016-12-06 15:11:26

#### 在线编程题

2016-03-03 17:03:31

#### 编程练习（1）

2016-07-23 17:33:51

#### 刷刷笔试题~~（3）

2016-05-30 22:40:04

#### Java实现以字符串某一位置为界，将它之前的部分与之后的部分互换位置

2018-03-21 17:01:29

#### 字符串的旋转

2017-07-25 23:16:14

#### 将一个字符串部分前置

2015-05-14 23:30:30

#### 互联网公司常见面试算法题

2017-04-21 21:22:54

#### 面试必备：常见排序算法的实现

2010-08-21 23:58:00

#### 面试常考的常用数据结构与算法

2017-04-18 09:51:10