每日做题总结——day02

news2024/11/14 6:14:41

目录

字符串处理函数,strcpy,strcat

数组指针

函数缺省值

 初始化列表​编辑

友元函数

new与delete

静态成员变量

new与构造函数 delete与析构函数

拷贝构造函数的特点

常成员函数

初始化列表

编程题

 字符串中找出连续最长的数字串

数组中超过一半的数

 进制转换

统计回文 


 

字符串处理函数,strcpy,strcat

strcpy(p,q):将q字符串中的内容拷贝到p所在的空间中,最后返回p;

注意:p的空间大小一定要能够村的下q中的字符综述,否则程序会崩溃。

strcat(p,q):将q字符串中的内容拼接在p字符串之后,最终返回p;

注意:p空间一定要能容纳下q拼接进来的字符。

解析:p1是一个数组,里面存放了abcd四个字符外加一个/0。p2是一个指针,"ABCD"是一块字符串常量,然而p2就指向了A字符。str是一个字符数组。

strcpy(str+2,strcat(p1+2,p2+1); 在这句表达式中,我们首先看strcat(p1+2,p2+1);

由上边strcat的作用可知此表达式是将p2+1(p2指向A,则p2+1往后偏移一个字符的长度,因此指向B)位置往后的字符串常量拼接在p1+2(p1是数组名,也就是首元素的地址,p1+2也就是p1数组中c的地址)上,并且返回p1+2。这一步下来之后,p1中的数据就变为了p1[15]="abcdBCD"。

然后再看strcpy这个函数,将p1+2位置往后的数据拷贝到str+2往后的数据上。得str[50]="xyabcdBCD"。

因此选择D选项。

数组指针

 解析:在这个语句中,首先创建了一个二维数组 n,包含两个大小为 3 的一维数组。然后声明了一个指向包含三个 int 类型元素的一维数组的指针 p

接着,将 p 指向 n 数组的第一个元素,即 p = &n[0];,这里可以简写成 p = n;,因为数组名 n 可以被解释为指向数组第一个元素的指针。

p[0][0]:

这样,指针 p 就指向了 n 数组的第一个元素,也就是第一个包含三个 int 类型元素的一维数组。因此,可以通过 p 访问 n 数组中的各个元素,比如 p[0][0] 就等于 n[0][0]p[1][2] 就等于 n[1][2]

通过这种方式,可以使用指针更加灵活地访问数组元素,而不必关心数组的实际存储方式。

*(p[0]+1):

 p[0]是指向二维数组中的第一个一维数组的第一个元素,p[0]+1是偏移了一个元素的大小,因此指向了第二个元素,*(p[0]+1)就是对此元素地址进行解引用得到的就是20;

(*p)[2]:

在这个语句中,(*p)[2] 表示 p 所指向的一维数组中第三个元素的值。由于 p 指向 n 数组的第一个元素,也就是第一个包含三个 int 类型元素的一维数组,因此 (*p)[2] 等价于 n[0][2],这个表达式的值为 30

需要注意的是,这里的 (*p) 是用于解引用 p 指针所指向的一维数组的方式,它的优先级比 [] 运算符高。因此,(*p)[2] 表示先解引用 p 指针得到一个包含三个 int 类型元素的一维数组,再访问其中的第三个元素。

函数缺省值

解析: 

A:函数带默认值的参数可以有很多个。

B:函数参数的默认值设定必须连续。

C:默认值可以设置,也可以不设置。

D:默认值设置的时候不能间断性的设置,一旦有一个参数设置了默认值,之后的所有参数都必须设置默认值,举例如下。

 

 初始化列表

 解析:

必须在初始化列表初始化的有:

1、const修饰的成员变量。

2、引用类型的成员变量。

3、类类型对象,该类没有默认的构造函数。

const修饰的成员变量

        注意:这里需要注意的是,在构造函数中,只有在初始化列表中初始化的数才叫做初始化。在别的地方只能算作赋值,而不是真正的初始化,因此const修饰的成员变量必须在初始化列表进行初始化。

 引用类型的成员变量

 类类型对象,该类没有默认的构造函数

因此,选择B选项。 

友元函数

解析:

C++ 中的友元函数没有 this 指针。

友元函数是一种特殊的非成员函数,它被声明为某个类的友元函数,可以访问该类的私有成员。虽然友元函数可以访问该类的私有成员,但它并不属于该类的成员函数,它没有 this 指针。这是因为友元函数不属于该类,它是一个全局函数,没有访问该类对象的权限,因此也就没有 this 指针。

当我们在友元函数中访问该类的成员时,需要通过函数参数传递该类的对象,然后通过该对象访问其成员,而不是使用 this 指针。

D选项中,友元函数是没有this指针的,所以是错误的。选择D选项。

new与delete

其实new和delete的本质就是调用malloc和free。

由题可知, new了5个对象,因此要调用5次构造函数对申请的空间进行初始化,但是只delete了一次,所以只调用1次析构函数。选择A选项。

静态成员变量

A:可以再类内初始化。

B:可以使用类中的对象调用,只不过静态数据成员在类的所有对象之间共享。

C:受private修饰符的作用。

D:可以使用类名加作用域符直接调用。

MyClass::myStaticMember = 42; // 通过类名访问静态成员

所以选择D选项。 

new与构造函数 delete与析构函数

解析:我们在使用new的时候会调用类的构造函数来对申请的空间进行初始化,使用delete的时候会调用析构函数进行释放空间的资源。如果直接创建对象,将会自动调用构造函数和析构函数。那么如果我们吧析构函数设为私有,那么直接创建对象的时候会报错(因为无法调用析构函数),但是使用new创建的时候就不会报错(因为new只会调用构造函数而不会调用析构函数)。所以选择B选项。

拷贝构造函数的特点

 A:拷贝构造函数没有返回值。

B:不是对某个对象的引用,而是同一类对象的引用。

C:最后一句,应该是作为该类的公共成员。

D:拷贝构造初始化函数作用就是将一个已知对象的数据成员值拷贝给正在创建的另一个同类的对象,而赋值运算符重载函数是讲一个已知对象赋值给已知对象。

因此选择D选项。

常成员函数

在函数声明或定义中,const 关键字通常用于修饰函数的参数或函数本身。在 void print() const 中,const 关键字修饰的是函数本身,表示该函数是一个常量成员函数。

常量成员函数表示该函数不会修改调用它的对象,因此可以被一个 const 对象(即对象被声明为 const)调用。在常量成员函数中,不允许修改对象的成员变量,也不允许调用非常量成员函数(因为非常量成员函数可能会修改对象)。

需要注意的是,常量成员函数的定义和声明中都需要加上 const 关键字。例如:

class MyClass {
public:
  void print() const; // 声明常量成员函数
};

void MyClass::print() const { // 定义常量成员函数
  // 函数实现
}

因此选择C选项。

初始化列表

在初始化列表中初始化成员的顺序:与该成员在初始化列表中出现的先后顺序没有关系,但与成员变量在类中生成的先后顺序有关。

因此无论输入都是a先调用Printer的构造函数,b后调用。

因此选择C选项。

编程题

 字符串中找出连续最长的数字串

字符串中找出连续最长的数字串_牛客题霸_牛客网

 定义三个string,遍历用str来接受字符串,然后遍历str。如果属于'0'到'9'就插入cur里面,利用ret来记录最长的串。

注意:我们在遍历的时候,判断条件一定要多写一位,因为只有这样才能把最后一个串给插入到cur中。具体看代码注释。

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

int main()
{
    string str,cur,ret;
    cin>>str;
    // getline(cin,str);
    // cout<<str<<endl;
    int i=0;
    //这里的for循环里面一定要多给一个值 如果最后一个字符串是最长的话
    //只有多给了一个值才能把最长的那个字符串(刚好在str的最后一段)赋值给cur
    for(i=0;i<=str.length();i++)
    {
        if(str[i]>='0'&& str[i]<='9')
        {
            cur+=str[i];
        }
        else
        {
            if(cur.size()>ret.size())
            {
                ret=cur;
            }
            else
            {
                cur.clear();
            }
        }
    }
    cout<<ret;
    return 0;
}
// 64 位输出请用 printf("%lld")

数组中超过一半的数

数组中出现次数超过一半的数字_牛客题霸_牛客网 

抵消法:因为是找超过一半的数,那么我们遍历的时候遇到两个不相等的就给消去,最后剩下的肯定只有超过一半的那个数了。

排序比较法:由于是超过一半的数,那么我们给数组中的数据进行排序。超过一半的数的位置一定在中位数的位置。 


 抵消法
class Solution
{
public:
    int MoreThanHalfNum_Solution(vector<int> numbers)
    {
        //首先记录第一个数,并将次数初始化为1
        int result = numbers[0], times = 1;
        // 从第二个数开始进行循环遍历
        for (int i = 1; i < numbers.size(); i++)
        {
            // 次数不等于0,说明之前已经记录的有数据
            if (times != 0)
            {
                // 所遍历的数据与前面的数据不相同时,次数减1
                // 其实也就是删除两个不相同的值
                if (numbers[i] != result)
                {
                    times--;//遍历到不一样的就销毁一个times
                }
                // 如果相同,则加1
                else
                {
                    times++;
                }
            }
            // 次数等于0,说明需要记录一个新的值,前面的值已经抵消完了
            else
            {
                result = numbers[i];
                times = 1;
            }
        }
        //    最终没被抵消完的值就是我们需要的值
        return result;
    }
};

 排序比较法
class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers)
    {
        //直接对numbers进行排序
        sort(numbers.begin(), numbers.end());
        // 取出中位数的下标
        int muddle = numbers.size() / 2;
        // 定义一个记录次数的变量
        int count = 0;
        // 利用范围for遍历numbers,计算出以中位数为下标数的次数
        for (auto& e : numbers)
        {
            if (e == numbers[muddle])
                count++;
        }
        // 如果次数大于中位数,就返回以中位数为下标的数
        // 如果次数小于中位数,则返回0
        return count > muddle ? numbers[muddle] : 0;
    }
};




 进制转换

进制转换_牛客题霸_牛客网 

 注意:

1、我们需要创建一个数组来记录"0123456789ABCDEF",然后通过下标来找对应的字符,原因是十六局进制的10对应的是A以此类推。

2、注意符号,如果我们需要处理的数是一个负数,那么注意符号的变化。


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

int main() {
    // 定义M和N
    int M, N;
    // 接受M和N
    cin >> M >> N;
    // 如果M是0的话,直接输出0,然后return 0 就行
    if(M==0)
    {
        cout<<M<<endl;
        return 0;
    }
    // 定义一个标志位,便于分清正负
    int flag = 1;
    // 如果M是负数,将标志位也改为负数
    if (M < 0)
    {
        // 这里注意,要将M转化为正数,便于我们的计算,到最后再根据标志位转回来
        M = -M;
        flag = -flag;

    }
    // 定义两个string,注意由于十六进制9往后的数据用的是字母表示
    // 所以我们需要定义一个数组来对这些字母进行存储,计算的时候便于遍历
    string s, table = "0123456789ABCDEF";
    // 开始遍历M
    while (M)
    {
        // 把M模出来的数先插入s中
        s += table[M % N];
        M /= N;
    }
    // 若flag<0说明我们的M是一个负数,不要忘了加-号
    if (flag < 0)
        s += '-';
    // 最后一步,将我们s中的数进行翻转,输出就是我们进制转换之后的数
    reverse(s.begin(), s.end());
    cout << s << endl;
    return 0;
}

统计回文 

统计回文_牛客题霸_牛客网

 

 我们需要str2插入在str1的每个字符的前后进行判断是否回文,具体看注释。

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

// 判断字符串是否是回文串
bool ishw(const string &str)
{
    size_t begin=0;
    size_t end=str.size()-1;
    while(begin<end)
    {
        if(str[begin]!=str[end])
        return false;
        begin++;
        end--;
    }
    return true;
}
int main() 
{
    string str1,str2;
    // 记录能构成回文串的个数
    size_t count=0;
    getline(cin,str1);
    getline(cin,str2);

    // 遍历待插入字符串中每个字符的前后位置
    // 注意:第一个字符前的位置和最后一个字符后的位置也要考虑
    // 这也是为啥判断条件是<=的原因
    for(int i=0;i<=str1.size();i++)
    {
    //     千万要记住,我们不能直接使用str1
    //     因为我们要多次插入,所以要使用一个额外的str来接受str1
        string str=str1;
        // 利用我们写的判断回文串函数进行判断,并且记录次数
        if(ishw(str.insert(i,str2)))
        count++;
    }
    cout<<count<<endl;
}
// 64 位输出请用 printf("%lld")

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/439655.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

字节的面试,你能扛住几道?

C &#xff0c; Python 哪一个更快&#xff1f; 读者答&#xff1a;这个我不知道从哪方面说&#xff0c;就是 C 的话&#xff0c;它其实能够提供开发者非常多的权限&#xff0c;就是说它能涉及到一些操作系统级别的一些操作&#xff0c;速度应该挺快。然后 Python 实现功能还…

从数据到应用 Web3不再纸上谈兵

继宣布拨款5000万港元加速推动Web3生态圈发展后&#xff0c;香港再次明确对Web3产业创新的支持。近日&#xff0c;香港Web3协会正式成立&#xff0c;创立Web3Hub基金&#xff0c;“东方之珠”正在大力推进第三代互联网的生态建设。 不仅仅是政策红利&#xff0c;ChatGPT等人工…

Web服务器配置(Tomcat)【Centos】

Tomcat 是一个轻量化服务器&#xff0c;理论上支持 20,000 个用户 LNMP&#xff1a;Linux Nginx MySQL LTMP&#xff1a;Linux Tomcat MySQL 1.Apache Tomcat 从版本7开始&#xff0c;若仅仅只需要部署HTML静态页面&#xff0c;Apache就可以完全够用 查看Apache是否安装 rpm -…

Ajax的特性以及用法

一、什么是Ajax 1、jQuery的Ajax ①&#xff1a;get方法​编辑 ②&#xff1a;post方法 ③&#xff1a;Ajax&#xff08;这个重要&#xff0c;jQuery的ajax最常用&#xff09; PS&#xff1a;一定要注意&#xff0c;数据类型是 json &#xff01;&#xff01;&#xff01; …

google breakpad中minidump_stackwalk的编译(Windows)

接上一篇的内容&#xff1a; breakpad编译指南&#xff08;Windows&#xff09;_我的胖是因为太膨胀的博客-CSDN博客 1、获取 googletest 放进 breakpad/src 目录下&#xff0c;并把目录名重命名为testing git clone https://github.com/google/googletest.git 如下图 2、把…

ROS2安装教程(virtualbox7.0.6+ROS2)

整个过程分两步&#xff1a;先安装Virtualbox&#xff0c;再安装ROS2 一、安装virtualbox7.0.6 网址&#xff1a;https://www.virtualbox.org/wiki/Downloads 问题1 安装时报错&#xff1a;缺少python core 、win32api依赖&#xff08;下图网上拷贝的图&#xff0c;版本忽略…

这份完整WhatsApp营销方案请收好!

WhatsApp是什么&#xff1f; WhatsApp是一种跨平台的即时通讯应用程序&#xff0c;可以在手机、平板电脑和电脑上使用。它允许用户发送文字消息、语音消息、图片、视频和文件等内容&#xff0c;同时还可以进行语音通话和视频通话。 WhatsApp拥有多种功能&#xff0c;包括但不…

Windows下通过CMake编译hiredis及应用

1、 在下载的redis-6.2.12.tar.gz的压缩包中&#xff0c;解压后有个deps文件夹&#xff0c;里面有个hiredis文件夹&#xff0c;是我们访问redis的C接口&#xff0c;需要我们手动编译后才能使用。&#xff08;redis: https://redis.io/download/&#xff09; 2、打开CMake软件&…

日本PSE认证日本的電気用品安全法METI备案

日本的電気用品安全法&#xff08;PSE认证&#xff09;法规要求日本的采购商在购进商品后一个月内必须向日本METI注册申报&#xff0c;并必须将采购商名称或ID标在产品上&#xff0c;以便在今后产品销售过程中进行监督管理&#xff0c;完成后将获得電気用品製造事業届出書&…

全球化背景下,如何利用内容营销促进跨境电商业务增长

随着全球跨境电商市场的迅速发展&#xff0c;越来越多的企业开始将注意力转向跨境电商。然而&#xff0c;随着竞争的激烈化&#xff0c;企业不再能够仅仅依靠产品本身来吸引消费者的注意。因此&#xff0c;内容营销成为了跨境电商企业在吸引、留住消费者方面的关键。在这篇文章…

【Spring】— Spring AOP

目录 一、Spring AOP简介1.什么是AOP2.AOP术语 二、AspectJ开发1.基于XML的声明式AspectJ1.1 配置切面1.2 配置切入点1.3 配置通知 2.基于注解的声明式AspectJ 一、Spring AOP简介 1.什么是AOP AOP的全称是Aspect-Oriented Programming&#xff0c;即面向切面编程&#xff08;…

芴甲氧羰酰基-氨基-聚乙二醇-巯基吡啶Fmoc-NH-PEG-OPSS

修饰性PEG芴甲氧羰基-氨基-聚乙二醇-巯基吡啶Fmoc-NH-PEG-OPSS是保护氨基的PEG衍生物之一 结构式&#xff1a; 芴甲氧羰酰基-氨基-聚乙二醇-巯基吡啶Fmoc-NH-PEG-OPSS聚乙二醇化可以提高聚乙二醇分子的稳定性&#xff0c;降低其免疫原性&#xff0c;仅用于科研实验。 FMOC-NH…

骨传导风靡蓝牙耳机市场 AI赋能有望打破行业技术桎梏

一、骨传导耳机行业概述 骨传导耳机是运用骨传导技术应用制造的耳机&#xff0c;听到的大部分声音都是声波经过空气到达骨膜振动进而将声音传入内耳&#xff0c;另一种方式是声波通过骨震动可以直接传至内耳。骨传导耳机可分为骨传导扬声器技术应用耳机、骨传导麦克风技术应用…

关于比较中设置极大值,常设置的0x3f3f3f3f

无穷大常量 int型变量的取值范围&#xff1a;[-2^31, 2^31 - 1] -> [-2147483648, 2147483647] 0x7fffffff 2147483647 (2^31 - 1) (1 << 31) - 1 0x3fffffff 1073741823 (2^30 - 1) (1 << 30) - 1 0x3f3f…

产品经理必读 | 俞军产品经理十二条军规

最近在学习《俞军产品方法论》&#xff0c;觉得俞军总结的十二条产品经理原则非常受用&#xff0c;分享给大家。 01. 产品经理首先是产品的深度用户 自己设计的产品都没使用过的产品经理&#xff0c;如何明白用户使用的问题&#xff0c;如何解决问题&#xff0c;所以产品经理肯…

java版工程项目管理系统源代码-功能清单 图文解析

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…

工信部第369批新品公示冷藏车占比显著提升,新能源“卡位战”已悄然打响

一、冷藏车行业概述 随着货物储运的种类不断增多&#xff0c;有些货物在储运过程中易受到外界温度、湿度等条件影响而发生腐烂变质。为了保持易腐货物的本来品质和使用价值&#xff0c;在运输途中不发生腐烂变质和数量上的短缺&#xff0c;提高货物运输的安全性&#xff0c;减…

​windows通过修改路由表,通过特定的网卡访问特定IP​

windows通过修改路由表&#xff0c;通过特定的网卡访问特定IP 方式&#xff1a;修改路由表&#xff0c;指定的IP网段走指定的无线网卡。 步骤1&#xff1a;查看无线网卡的网关信息。终端里输入ipconfig&#xff0c;找到无线网卡对应的网关信息&#xff1b;这里是192.168.44.1…

深度学习训练营Resnet之鸟类识别

深度学习训练营之鸟类识别 原文链接理论知识储备为什么会提出ResNetResNet 环境介绍前置工作设置GPU导入数据并进行查找 数据处理可视化数据配置数据集 残差网络的介绍构建残差网络模型训练开始编译 结果可视化训练样本和测试样本预测 原文链接 &#x1f368; 本文为&#x1f5…

2023-04-19 算法面试中常见的递归和回溯问题

递归和回溯 0 递归与回溯的异同 参考文章 递归与回溯递归与回溯的理解回溯和递归区别 比较 递归回溯定义为了描述问题的某一状态&#xff0c;必须用到该状态的上一状态&#xff0c;而描述上一状态&#xff0c;又必须用到上一状态的上一状态……这种用自已来定义自己的方法…