【笔试刷题训练】day_07

选择题

在这里插入图片描述

内联函数对于编译器只是一个建议,如果该函数没有递归、循环、并且代码较少,那么编译器就会采取内联,否则就不会采取内联的建议
所以选择:C

在这里插入图片描述

  1. 缺省参数只能从右向左依次给,例如void func(int a,int b= 10,int c = 10,所以如果某一个参数是缺省的,它后面的参数一定都是缺省的
  2. 缺省参数可有可无
  3. 全缺省:全部缺省;半缺省:部分缺省
  4. 调用函数的时候, 传参是从左向右传递参数,与给缺省参数的顺序相反

在这里插入图片描述

回顾:类的两种定义方式

  1. 声明和成员函数的定义都放在类里面
  2. 类中放成员变量和成员函数的声明,类外部(可以放在其他.cpp中)进行成员函数的定义(返回类型 类名::成员函数(参数列表))

所以答案选A,类中包括数据成员和函数成员的声明

B: 默认权限是私有
C: 共有、私有、保护哦都可以
D: 可以在类外,也可以在类里定义

在这里插入图片描述

初始化列表是成员真正初始化的地方,初始化列表中,只能对类中非静态的成员变量进行初始化,因为静态的成员变量是不依赖于对象,只是依赖于类的!
静态成员在类外部进行初始化

三种必须在初始化列表进行初始化的成员

  1. 没有默认构造函数的自定义类型的成员
  2. 引用成员
  3. const成员

所以,题目中只有bc符合,选B

在这里插入图片描述

A: 3+3是内置类型相加
B: b1+3 其实是调用b1.opertor+(&b1,3),这里因为该类具有单参数的构造函数,所以实参3在传递给operator+()的形参的时候,会发生:

  1. 用3构造一个临时对象
  2. 临时对象拷贝构造出形参

所以b1+3是可以完成调用的!

C: b1+b2 调用 b1.operator(&b1,b2)
D: 3+d1,重载的operator+()的第一个参数隐藏默认的是this,所以+号之前一定是一个BigNumber的对象。第一个参数是int类型,没有对应的函数重载,所以会报错!

在这里插入图片描述

友元函数不是类的成员函数,但是在友元函数中可以访问类中私有成员
成员函数具有隐含的this,受访问限定符的限制



A: A的说法不是很清楚,我的理解是:友元函数可以访问本类的所有对象。并且如果一个类是另一个类的友元类,那么这个友元类可以随意访问另一个类的内部成员,因为友元类中的所有成员函数都是另一个类的友元函数
B: 声明为友元,我是你的朋友自然可以访问你的私有成员变量或成员函数
C: 类的成员函数有this指针,没问题,但是选项说的有一些问题,应该是非静态的成员函数才具有this指针,静态成员函数可以直接通过类名+域作用限定符来访问
D: 友元函数不是成员函数!没有this指针

编程题

1. 合法括号序列判断

👉 题目链接

判断括号序列是否合法,显然要用到后进先出的栈

  1. 遇到左括号,入栈
  2. 遇到右括号,如果此时栈为空,说明没有左括号与之匹配,如果不为空,左右括号匹配,弹出左括号
  3. 如果遇到的既不是左括号也不是右括号,说明不合法(题目说了序列只能由括号组成)
  4. 那么最后如果栈为空,说明所有括号都匹配,如果栈不为空,说明有多余的左括号没有匹配到右括号返回false

代码

class Parenthesis {
public:
    bool chkParenthesis(string A, int n) {
        // write code here
        stack<char> st;
        //遍历字符串A
        for(size_t i = 0;i< n;++i)
        {
            //如果不是括号,返回false
            if(A[i]!='(' && A[i]!=')')
            {
                return false;
            }
            //如果是左括号,入栈
            if(A[i] == '(')
            {
                st.push(A[i]);
            }
            //如果是右括号,出栈(这里要注意检查是否为空,空就不出栈)
            else if(A[i]==')')
            {
                //如果栈为空,说明没有匹配的左括号
                if(st.empty())
                {
                    return false;
                }
                else//栈不为空,配对弹出
                {
                    st.pop();
                }
            }
        }
        //返回栈是否为空即可
        return st.empty();
    }
};

2. Fibonacci数列

👉 题目链接

题目让我们求出输入一个N,需要多少步才可以变成一个Fibonacci数

思路很简单

  1. 根据所给的N,求出N前面和N后面的那两个Fibonacci数left和right
  2. 取max(left,right)即可
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int N;
    cin >> N;
    
    int f1 = 0;
    int f2 = 1;
    int ans =0;
    //N超过ans的时候跳出循环
    while(N > ans)
    {
        ans = f1 + f2;
        f1=f2;
        f2=ans;
    }
    
    //跳出的时候 N >= ans
    // f1  N  ans
    // f1就是N前面那个Fibonacci数,ans是N后面那个
    cout << min(ans-N,N-f1) << endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2021狮子歌歌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值