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

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);
}
};

• 本文已收录于以下专栏：

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

1、假设淘宝一天有5亿条成交数据，求出销量最高的100个商品并给出算法的时间复杂度。 先用哈希，统计每个商品的成交次数，然后再用在N个数中找出前K大个数的方法找出成交次数最多的前100个商品。 优...
• jiangyanting2011
• 2017年04月21日 21:22
• 3068

## Java实现面试常考的算法

Java实现面试常考的算法 查找算法 排序算法 插入排序 选择排序 冒泡排序 快速排序Java实现面试常考的算法 我自己总结了几个平时面试问得一些算法题, 都是非常非常基础的问题. 查找算法 ...
• u013144863
• 2016年11月20日 10:55
• 8342

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

• JIEJINQUANIL
• 2016年08月30日 17:41
• 1084

## 代码面试最常用的10大算法

• u012827205
• 2014年04月15日 14:45
• 1909

## 代码面试最常用的10大算法

• Mr__fang
• 2014年04月28日 13:51
• 3597

## 经典算法面试题及答案

• chenjie863
• 2014年05月07日 16:48
• 73143

## 算法经典面试题整理（java实现）

• DUANJIEFEI
• 2015年06月11日 19:23
• 10068

## 数据结构与算法面试题80道

• jokes000
• 2011年12月14日 15:11
• 123473

## 排序算法总结及面试题

• sunxianghuang
• 2016年07月19日 11:48
• 5043

## 面试常用算法总结——排序算法（java版）

• XSF50717
• 2015年08月06日 15:57
• 9067

举报原因： 您举报文章：面试常考算法题总结(一) 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)