不到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;
}