不到5分钟写完,今天的题又又又难一点啦!
1.Fibonacci数列
思路:
直接模拟一遍斐波那契数列的递增过程,大于n就直接结束。因为后面只会越来越大,跟题目求的最小步数不符。在这个过程中用一个变量去维护这个当前的元素与目标n还差多少,这个差值就是n变成这个当前元素的步数。整个过程取min就欧克了。
代码:
#include <iostream>
#include<algorithm>
using namespace std;
int main() {
int n;
cin>>n;
int a=0;
int b=1;
int ans=min(abs(0-n),abs(1-n));//初始化
while(a+b<n){
ans=min(ans,abs(n-(a+b)));
int c=a+b;
a=b;
b=c;
}
ans=min(ans,abs(n-(a+b)));
cout<<ans;
return 0;
}
2.单词搜索
思路:
没什么可说,数据小,直接dfs。
先搜索一下整个字符数组,如果有字符和word[0]相等,那么说明这个点可以作为dfs的起点。
直到搜索到一条完整的路径匹配word。
剩下的就是老掉牙的搜索过程了。一共有四个方向,用两个数组分别模拟坐标位移的横纵偏移量。每个点只能走一次,每次搜这个点对应的字符必须与目标字符相同,因为我们是带着目的去搜索的,下一个点要搜索到什么字符,可以用一个变量pos去维护.
代码:
#define _CRT_SECURE_NO_WARNINGS 1
int dx[] = { 0,0,-1,1 };
int dy[] = { -1,1,0,0 };
bool ans;
int n, m;
bool st[110][110];
class Solution {
public:
void dfs(int x, int y, vector<string>& board, string word, int pos) {
if (pos == word.size()) {
ans = true;
return;
}
for (int i = 0; i < 4; i++) {
int a = dx[i] + x;
int b = dy[i] + y;
if (a >= 0 && a < n && b >= 0 && b < m && board[a][b] == word[pos] && !st[a][b]) {
st[a][b] = true;
dfs(a, b, board, word, pos + 1);
st[a][b] = false;
}
}
}
bool exist(vector<string>& board, string word) {
n = board.size();
m = board[0].size();
ans = false;
memset(st, false, sizeof st);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (board[i][j] == word[0]) {
st[i][j] = true;
dfs(i, j, board, word, 1);
st[i][j] = false;
if (ans)return true;
}
}
}
return false;
}
};
3.杨辉三角
思路:
没思路,直接模拟一遍就行了。
要注意的是,题目要求的是每个输出宽度为5,并不是输出带空格。只是样例看起来样例带了空格
代码:
#include <iostream>
using namespace std;
const int N = 35;
int a[N][N];
int main() {
int n;
cin >> n;
a[1][1] = 1;
printf("%5d\n", 1);
for (int i = 2; i <= n; i++) {
for (int j = 1; j <= i; j++) {
a[i][j] = a[i - 1][j] + a[i - 1][j - 1];
printf("%5d", a[i][j]);
}
if (i != n)cout << endl;
}
return 0;
}