每日一题 | day18(统计每个月兔子的总数|字符串通配)

Posted WhiteShirtI

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题 | day18(统计每个月兔子的总数|字符串通配)相关的知识,希望对你有一定的参考价值。

选择题

1、使用printf函数打印一个double类型的数据,要求:输出为10进制,输出左对齐30个字符,4位精度。以 下哪个选项是正确的?
A %-30.4e
B %4.30e
C %-30.4f
D %-4.30f

正确答案 C:%m.n中,m为正数时表示向右对齐,输出m位,不够用空格在前面补上;当m为负数时,表示向左对齐位。如果输出的类型为%f,则n表示精确到小数点后n位,不够后面补0,表示小数点后面共有n位;如果类型为%d,则m表示要输出的位数,小于数据长度则前面补空格,如果是0m则表示不够位数前面补0

2、malloc函数进行内存分配是在什么阶段?
A 编译阶段
B 链接阶段
C 装载阶段
D 执行阶段

正确答案 D:略

编程题

题目1:
在这里插入图片描述
题解思路:用first、second、third分别表示1、2、3月份的兔子数量。第一个月是first=1、second=0、third=0。所以要从第二个月开始算,第一个月的兔子应该为second+third,其中这里的second表示的是兔子开始进入第三个月,开始生兔子,third表示已经生过的兔子,每个月还要继续生。second应该为第一个月的兔子的数量,third应该为第二个月兔子的数量和原本兔子的数量。最后返回每个月的兔子的总和

代码:

#include <iostream>
#include <vector>
using namespace std;

int totalRabbit(int& month)
{
    int first = 1, second = 0, third = 0;
    while (--month)
    {
        third += second;
        second = first;
        first = third;
    }
    return first + second + third;
}

int main()
{
    int month;
    while (cin >> month)
    {
        cout << totalRabbit(month) << endl;
    }
    return 0;
}

这道题也可以化为斐波那契数列

#include <iostream>
#include <vector>
using namespace std;

int totalRabbit(int& month)
{
    if (month <= 2)
        return 1;
    int f1 = 1;
    int f2 = 1;
    int res = 0;
    for (int i = 2; i < month; ++i)
    {
        res = f1 + f2;
        f1 = f2;
        f2 = res;
    }
    return res;
}

int main()
{
    int month;
    while (cin >> month)
    {
        cout << totalRabbit(month) << endl;
    }
    return 0;
}

题目2:
在这里插入图片描述
解题代码思路:定义通配字符串pattern,查看是否匹配字符串str。比较方式有3种,第一种是字符与字符比较,第二种是字符与?比较,第三种是*与字符比较

这道题我们用递归的方式去比较两个字符串。递归结束条件有3个,第一个是如果两字符同时走到尾表示匹配,返回true;如果存在一个走到尾,一个没走到尾表示不匹配,返回false。如果两个字符串遍历到的相同位置字符不同,则表示不匹配,返回false。当* pattern为 '?‘时表示匹配一个字符,则递归参数为两个指针都向后移动一个位置继续判断。当* pattern为’*'时匹配的情况分为3种,第一种为匹配0个字符串,则递归参数为pattern不变,str向后走一个位置;第二种为匹配1个字符串,则递归参数为pattern向后走一个位置和str向后走一个位置;第三种为匹配多个字符,则递归参数为pattern不变,str向后走一个位置,也就是让str自己走,直到只匹配一个为止。当两个字符相等时表示目前匹配,还需要往后匹配查看是否匹配,递归参数都为向后走一个位置

在这里插入图片描述

代码:

#include <iostream>
#include <string>
using namespace std;

bool strMatch(const char* pattern, const char* str)
{
    if (*pattern == '\\0' && *str == '\\0') //一起结束表示正确匹配
        return true;
    
    if (*pattern == '\\0' || *str == '\\0') //一个字符串先结束则表示不匹配
        return false;
    
    if (*pattern == '?') //遇到?,两个字符串都向后移动一个位置
        return strMatch(pattern + 1, str + 1);
    else if (*pattern == '*')
        return strMatch(pattern + 1, str)  //匹配0个
            || strMatch(pattern + 1, str + 1)  //匹配1个
            || strMatch(pattern, str + 1); //匹配多个
    else if (*pattern == *str) //相同一起往后走
        return strMatch(pattern + 1, str + 1);
        
    return false; //不同直接返回
}

int main()
{
    string pattern, str;
    while (cin >> pattern >> str)
    {
        if (strMatch(pattern.c_str(), str.c_str()))
            cout << "true" << endl;
        else
            cout << "false" << endl;
    }
    return 0;
}

以上是关于每日一题 | day18(统计每个月兔子的总数|字符串通配)的主要内容,如果未能解决你的问题,请参考以下文章

Java版ojday18统计每个月兔子的总数字符串通配符

每日一题 错选择 及 编程题 周总结

统计每个月兔子总数

华为机试题 HJ37统计每个月兔子的总数

华为机试HJ37:统计每个月兔子的总数(斐波那契数列)

统计每个月兔子的总数(HJ37)