9月6日字节跳动笔试总结
题目描述:
有个楼梯比较高,我们有多种方式可以走上去,但是在走楼梯的时候有几个限制:一是每次只可以走一步或者两步,而且不能连续的走两步,那么我们需要计算多少种走法。
输入:楼梯的层数
输出:总共有多少种走法
解析:可以将一个n阶楼梯的走法分为两种,一种是最开始先走一步的,记为n1n_1n1,一种是最开始先走两步的n2n_2n2。那么一个n阶楼梯的走法就是这两种走法的和ntotal=n1+n2n_{total} = n_1 + n_2ntotal=n1+n2。对于一个n+1阶楼梯的走法,也分为先走一步,那么先走一步的方法(n+1)1{(n+1)}_1(n+1)1就等于ntotaln_{total}ntotal,先走两步的方法(n+1)2{(n+1)}_2(n+1)2就等于(n+1−2)1{(n+1-2)}_1(n+1−2)1,(n+1)total=(n+1)1+(n+1)2{(n+1)}_{total} = {(n+1)}_1 + {(n+1)}_2(n+1)total=(n+1)1+(n+1)2。
代码
#include <iostream>
#include <vector>
using namespace std;
struct VN{
int one_begin_ = 0;
int two_begin_ = 0;
VN(int x = 0, int y = 0){
one_begin_ = x;
two_begin_ = y;
}
};
int getWaysN(int n){
vector<struct VN> f;
f.push_back(VN(0,0));
f.push_back(VN(1,0));
f.push_back(VN(1,1));
for (int i = 3; i <= n; ++i) {
VN c = VN();
c.one_begin_ = f[i-1].one_begin_ + f[i-1].two_begin_;
c.two_begin_ = f[i-2].one_begin_;
f.push_back(c);
}
return f[n].two_begin_ + f[n].one_begin_;
}
int main(){
int n = 6;
int a = getWaysN(n);
cout << a;
return 0;
}
此处我是用了一个结构用来保存n阶楼梯的方法,one_begin_表示最开始走一步的走法,two_begin_表示最开始走两步的走法。
上述方法也可以使用常数个变量来降低空间复杂度。
这篇博客总结了字节跳动笔试中的一道题目,关于如何在不能连续走两步的情况下爬上楼梯的问题。通过解析和递归算法,阐述了计算不同阶楼梯走法的思路和代码实现,降低了空间复杂度。
1297

被折叠的 条评论
为什么被折叠?



