笔试练习day4

Fibonacci数列(简单)(dp)

Fibonacci数列_牛客题霸_牛客网 (nowcoder.com)

描述

Fibonacci数列是这样定义的:
F[0] = 0
F[1] = 1
for each i ≥ 2: F[i] = F[i-1] + F[i-2]
因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, …,在Fibonacci数列中的数我们称为Fibonacci数。给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fibonacci数。

输入描述:

输入为一个正整数N(1 ≤ N ≤ 1,000,000)

输出描述:

输出一个最小的步数变为Fibonacci数"

示例1

输入:

15

复制

输出:

2

代码

#include <iostream>
using namespace std;
int dp[1000010];
int main() 
{
    int a;
    cin >> a;
    dp[0] = 0;
    dp[1] = dp[2] = 1;
    for (int i = 3; i <= 1000000; i++)
    {
        dp[i] = dp[i - 1] + dp[i - 2];
        if (dp[i] >= a)
        {
            int t1 = a - dp[i - 1];
            int t2 = dp[i] - a;
            cout << min(t1, t2);
            break;
        }
    }
}

NC242 单词搜索 (简单)(dfs,bfs)(注意回溯)

单词搜索_牛客题霸_牛客网 (nowcoder.com)

给出一个二维字符数组和一个单词,判断单词是否在数组中出现, 单词由相邻单元格的字母连接而成,相邻单元指的是上下左右相邻。同一单元格的字母不能多次使用。 数据范围: 0 0 0 例如: 给出的数组为[“XYZE”,“SFZS”,“XDEE”]时, 对应的二维字符数组为: 若单词为"XYZZED"时,应该返回 true, 也即: 若单词为"SEE"时,应该返回 true, 也即: 若单词为"XYZY"时,应该返回 false。

示例1

输入

["XYZE","SFZS","XDEE"],"XYZZED"

输出

true

示例2

输入

["XYZE","SFZS","XDEE"],"SEE"

输出

true

示例3

输入

["XYZE","SFZS","XDEE"],"XYZY"

输出

false

代码

class Solution {
  public:
    /**

    * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可

        *  @param board string字符串vector
             * @param word string字符串
                @return bool布尔型
                    */
    int n, m;
    int dx[4] = {0, 0, 1, -1};
    int dy[4] = {1, -1, 0, 0};
    bool vis[110][110];

    bool dfs(vector<string>& board, int i, int j, string word, int pos) 
    {
        if (pos == word.size()) return true;
        vis[i][j] = true;

        for (int k = 0; k < 4; k++) {
            int x = dx[k] + i, y = dy[k] + j;
            if (x >= 0 && x < n && y >= 0 && y < m && !vis[x][y] &&board[x][y]==word[pos]) 
            {
                
                bool t = dfs(board, x, y, word, pos + 1);
                if (t == true) return true;
            }
        }
        vis[i][j] = false;
        return false;
    }

    bool exist(vector<string>& board, string word) 
    {
        n = board.size();
        m = board[0].size();
        for (int i = 0; i < n; i++) 
        {
            for (int j = 0; j < m; j++) 
            {
                if (board[i][j] == word[0]) 
                {
                    memset(vis, false, sizeof(vis));
                    bool t = dfs(board, i, j, word, 1);
                    if (t == true) 
                    {
                        return true;
                    }
                }
            }
        }
        return false;
    }
};

BC140 杨辉三角(简单)(模拟,dp)

杨辉三角_牛客题霸_牛客网 (nowcoder.com)

描述

KiKi知道什么叫杨辉三角之后对杨辉三角产生了浓厚的兴趣,他想知道杨辉三角的前n行,请编程帮他解答。杨辉三角,本质上是二项式(a+b)的n次方展开后各项的系数排成的三角形。其性质包括:每行的端点数为1, 一个数也为1;每个数等于它左上方和上方的两数之和。

输入描述:

第一行包含一个整数数n。 (1≤n≤30)

输出描述:

包含n行,为杨辉三角的前n行,每个数输出域宽为5。

示例1

输入:

6

复制

输出:

    1
    1    1
    1    2    1
    1    3    3    1
    1    4    6    4    1
    1    5   10   10    5    1

代码

#include <iostream>
#include<vector>
using namespace std;
vector<int> arr(35);
int main() 
{
  int n;
  cin>>n;
  for(int i=1;i<=n;i++)
  {
    if(i==1) 
    {
      printf("%5d",1);
      arr[1]=1;
      cout<<endl;
    }
    else 
	{
      vector<int> t(35);
      t[1]=1;
      for(int j=2;j<=i;j++)
      {
        t[j]=arr[j]+arr[j-1];
      }
      for(int j=1;j<=i;j++)
      {
       printf("%5d",t[j]);
      }
      arr=t;
      cout<<endl;
    }
  }
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Perl编程语言是一种强大的脚本编程语言,适用于各种任务和领域,包括文本处理、系统管理、网络编程等。下面是一个Perl编程的笔试练习题的解答: 题目:编写一个Perl脚本,统计一个文本文件中每个单词出现的次数,并按照频率从高到低的顺序输出。 解答: ```perl #!/usr/bin/perl use strict; use warnings; my $filename = 'text.txt'; open(my $file, "<", $filename) or die "无法打开文件:$!"; my %word_count; while (my $line = <$file>) { chomp($line); my @words = split(' ', $line); foreach my $word (@words) { $word =~ s/[^a-zA-Z]//g; # 只保留字母字符 next if $word eq ''; # 跳过空字符串 $word_count{lc($word)}++; } } close($file); foreach my $word (sort { $word_count{$b} <=> $word_count{$a} } keys %word_count) { print "$word: $word_count{$word}\n"; } ``` 这个Perl脚本首先打开指定的文本文件,并使用`<`操作符将文件内容读入到循环变量`$line`中。在每次迭代中,我们将每一行字符串使用空格进行分割,得到一个单词数组`@words`。接下来,我们使用一个循环遍历`@words`数组中的每个单词,并进行一些处理: 1. 使用正则表达式`s/[^a-zA-Z]//g`去除单词中的非字母字符; 2. 使用`next if $word eq '';`跳过空字符串; 3. 使用`lc($word)`将单词转换为小写字母形式,并将其作为哈希表`%word_count`的键,将该单词的出现次数加一。 在循环结束后,脚本将按照单词出现次数从高到低的顺序对`%word_count`进行排序,并循环打印输出每个单词和其出现次数。 以上是对Perl编程的笔试练习题的参考解答,希望对您有帮助。如果有任何疑问,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值