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