C++笔试强训day6

目录

1.Fibonacci数列

2.单词搜索

3.杨辉三角


1.Fibonacci数列

链接

解析题目本意就是找到离斐波那契数最近的那个输入数的距离。

很简单的思路,直接一边建立斐波那契数列,一边判断是否已经小于这个斐波那契数,直接break中断循环,然后判断其离前后距离那个更近(也就是去min)。

详细代码:

#include <iostream>
#include <algorithm>

using namespace std;
const int N = 1e6;
int Fib[N];

int main() {
    int n;
    cin >> n;
    Fib[0] = 0;
    Fib[1] = 1;
    int i;
    for (i = 2; i < N; ++i) {
        Fib[i] = Fib[i - 1] + Fib[i - 2];
        if (n <= Fib[i]) {
            break;
        }
    }
    int mid = i;
    cout << min(Fib[i] - n, n - Fib[i - 1]) << endl;
}

2.单词搜索

链接

大体一看就可以知道是一道DFS(深度优先遍历)题。

判断好返回条件就很简单了,就当pos遍历到最后一个数时,就可以返回true了。

注意:最后如果搜索到底没结果,记得将vis回溯,就一开始遍历过的数调回没遍历过。

详细代码:

class Solution {
public:
    const static int N = 120;

    bool vis[N][N] = { false };
    int dx[4] = {0,0,1,-1};
    int dy[4] = {1,-1,0,0};
    int m, n;

    bool DFS(vector<string>& board, int i, int j, string word, int pos)
    {
        if(pos == word.size() - 1)
            return true;
        
        vis[i][j] = true;
        for(int k = 0; k < 4; ++k)
        {
            int x = i + dx[k], y = j + dy[k];

            if(x >= 0 && x < m && y >= 0 && y < n && board[x][y] == word[pos + 1] && !vis[x][y])
            {
                if(DFS(board, x, y, word, pos + 1))
                    return true;
            }
        }
        vis[i][j] = false;

        return false;
    }

    bool exist(vector<string>& board, string word) {
        m = board.size();
        n = board[0].size();

        for(int i = 0; i < m; ++i)
        {
            for(int j = 0; j < n; ++j)
            {
                if(board[i][j] == word[0] && !vis[i][j])
                {   
                    if(DFS(board, i, j, word, 0))
                        return true;
                }
            }
        }

        return false;
    }
};

3.杨辉三角

链接

简单题目不加赘述。

直接上代码。

注意:最后打印记得左靠齐五格就行。

#include <iostream>

using namespace std;
int dp[31][31];
int main() {
    int n;
    cin >> n;
    dp[1][1] = 1;
    for (int i = 2; i <= n; i++) {
        for (int j = 1; j <= i; j++) {
            dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1];
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= i; j++) {
            printf("%5d", dp[i][j]);
        }
        printf("\n");
    }
    return 0;
}
  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值