【c++5道练习题】①
目录
一、有限制的累加
二、计算日期到天数转换
三、仅仅反转字母
四、 字符串的第一个唯一字符
五、字符串最后一个单词的长度
一、有限制的累加
题述:
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)
题中已给:
class Solution { public:int Sum_Solution(int n){} };
知识点考察:
类的构造函数+ static修饰
先给代码再说思路:
代码如下:
#include<iostream>
using namespace std;class Sum
{
public:Sum()//构造函数{_sum += _i;++_i;}static void Init(){//静态成员函数可以访问静态成员变量_i = 1;_sum = 0;}static int GetSum()//静态成员函数可访问静态成员变量{return _sum;}
private:static int _i;//静态成员变量类内声明static int _sum;
};
int Sum::_i = 1;//静态成员变量类外定义(定义的同时初始化)
int Sum::_sum = 0;class Solution
{
public:int Sum_Solution(int n){Sum::Init();//每调用一次Sum_Solution函数都要初始化一次,不然会一直累加Sum* p = new Sum[n];//创建的同时,会调用n次构造函数//Sum a[n];//c99下才支持的变长数组return Sum::GetSum();//静态成员函数可通过类名直接访问}
};int main()
{Solution st;//实例化一个对象cout << st.Sum_Solution(5) << endl;//累加cout << st.Sum_Solution(5) << endl;system("pause");return 0;
}
思路:
自定义类型都要调用构造函数初始化,比如Date a[10] -》10个对象就要调用10次构造函数
那么n个对象就会调用n次构造函数,就像一个变相的循环
问题:
为什么要用GetSum函数?
因为成员变量_i和_sum都是private权限下的,故在类外无法直接访问,所以用GetSum进行返回
为什么要用static修饰?
因为static是属于类的,每个对象都可以修改静态变量,那就可以实现一个累加效果,那用全局变量不可以吗,当然可用,但是c++中不推荐用全局变量,因为c++强调封装的意义,如果是全局变量谁都可以修改了。
成员函数用static修饰是因为
①、static成员函数才可访问成员变量
②、静态成员函数可通过类名加::的方式直接访问
成员变量用static修饰是因为
①、所有对象调用时都会对同一个static变量上运算
要特别注意一个问题:
每求一次累加和,都要初始化一次,因为OJ上有多个测试用例,需要多次测试的,你在自己编译器下可能就运行一次就跑出来了,但OJ上还是不通过,对于本题,这可能就因为连续累加,每调用一次Sum_Solution函数都在之前基础上累加,为了避免这个问题,我们再每一次调用Sum_Solution函数时都初始化一次(Init函数)。
二、计算日期到天数转换
题述:
根据输入的日期(某年某月某日),计算是这一年的第几天。
输入描述:
输入三行,分别是年、月、日
输出描述:
返回计算后的第几天
输入:
2012
12
31
输出:
366
思路:
①、创建一个日期类,并写一个运算符相减的重载,用这个日期减去本年的1月1号即可,但是对于这道题复杂化了
②、从1月累加到本月的前一月,计算天数,时间复杂度:O(1),这个方法简单,本题采用此方法
代码如下:
#include<iostream>
using namespace std;int main()
{static int monthDays[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };int year, month, day;//这样可不断接收输入,直到按ctrl+z就结束while (cin >> year >> month >> day){int n = 0;//从1月累加到month的前一月的天数for (int i = 1; i < month; i++){n += monthDays[i];}n += day;//如果是闰年,且>2月的前提下if (month > 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0))n += 1;cout << n << endl;}return 0;
}
注意:
一定要加个while,因为OJ上有多个测试用例,不加while的话一个测试用例是能过,但是OJ上会连续输入,那OJ上也要手动按Ctrl+z结束吗?不是,是OJ把测试用例写入文件中了,然后运行时读文件,读完给后台发个信号就完成了。
三、仅仅反转字母
题述:给定一个字符串 s ,返回“反转后的”字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。
示例1:
输入:“ab-cd”
输出:“dc-ba”
示例2:
输入:“a-bc-dEf-ghIj”
输出:“j-Ih-jfE-dcba”
题中已给:
class Solution{ public:string reverseOnlyLetters(string s) {} };
思路:
遍历方法用下标访问方便,不采用迭代器遍历字符串。
本质思路类似于快速排序实现的单趟排序的左右指针法
仅仅交换字母,那就定义两个下标begin=0,end=字符串大小-1,begin从左向右走,end从右向左走,两者直到找到对应的值为字母才会停下并交换,那整个大前提就是begin<end才会继续,在begin和end找的过程中也要要求begin<end,不然若字符串全不是字母,begin会一直走,然后越界。
class Solution{
public://判断一个字符是不是字母bool Ischar(char ch){if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')){return true;}else{return false;}}//仅仅交换字母string reverseOnlyLetters(string s) {int begin = 0;int end = s.size() - 1;//算出s的大小,求出最后一个数的下标while (begin < end)//大前提是begin < end循环才继续{while (begin < end && Ischar(s[begin]) == false){//在走的过程中begin < end才能继续往下走,直到找到s[begin]是字母为止begin++;}while (begin < end && Ischar(s[end]) == false){//在走的过程中begin < end才能继续往下走,直到找到s[end]是字母为止end--;}swap(s[begin], s[end]);//c++自动提供swap交换函数//交换完后begin还要++,end还要--begin++;end--;}return s;//返回字符串}
};
四、 字符串的第一个唯一字符
题述:
给定一个字符串,找到他的第一个不重复的字符,并返回它的索引。若不存在,则返回-1.
案例:
s = "leetcode"
返回 0
s = "loveleetcode"
返回 2
要求:
时间复杂度:O(N)
空间复杂度:O(1)
注意事项:
您可假定该字符串只包含小写字母
题中已给:
class Solution { public:int firstUniqChar(string s) {} };
思路:
利用计数排序的思路,计数排序的本质就是哈希,若用暴力求解法时间复杂度:O(N*N)
和计数排序思路一样,不会计数排序就看我写的八大排序的文章
class Solution {
public:int firstUniqChar(string s) {//使用映射的方式统计次数int count[26] = { 0 };//26个小写字母for (auto ch : s){//范围for遍历scount[ch - 'a']++;//'a'-'a'就变为0}for (size_t i = 0; i < s.size(); ++i){if (count[s[i] - 'a'] == 1)return i;//出现一次则返回对应索引}return -1;//没有出现一次的则返回-1}
};
五、字符串最后一个单词的长度
题述:
计算字符串最后一个单词的长度,单词以空格隔开
输入描述:
一行字符串,非空,长度<5000
输出描述:
整数N,最后一个单词的长度
输入:
hello world
输出:
5
思路:
因为每个单词都以空格分隔,求长度简单,但怎么找最后一个单词,找最后一个空格即可,那就可用到rfind(),若找到对应字符返回其下标,若没找到返回-1,它会从后往前找,找到第一次的即可。
那一个单词也没有空格怎么办?rfind()没找到会返回-1,而代码中s.size() - 1 - pos,pos=-1,相当于直接求出长度,所以无需格外考虑
典型的错误代码:
#include<iostream>
using namespace std;int main()
{string s;cin >> s;//输入字符串//从字符串后面往前找第一次出现的' ',并返回其下标给possize_t pos = s.rfind(' ');//利用下标计算最后一个单词的长度cout << s.size() - 1 - pos << endl;return 0;
}
注意:
当输入的有空格、制表符、换行符时cin就不读了和scanf一样,但本题以空格为分隔,故用getline才行,getline只有遇到换行才结束
getline的使用说明如下:
正确代码:
#include<iostream>
#include<string>
using namespace std;int main()
{string s;//cin >> s;//遇到空格、制表符、换行就结束了getline(cin, s);//遇到换行才结束//从字符串后面往前找第一次出现的' ',并返回其下标给possize_t pos = s.rfind(' ');//利用下标计算最后一个单词的长度cout << s.size() - 1 - pos << endl;return 0;
}
相关文章:

【c++5道练习题】①
目录 一、有限制的累加 二、计算日期到天数转换 三、仅仅反转字母 四、 字符串的第一个唯一字符 五、字符串最后一个单词的长度 一、有限制的累加 题述: 求123...n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句…...

最佳实践:TiDB 业务读变慢分析处理
作者:李文杰 网易游戏计费 TiDB 负责人 在使用或运维管理 TiDB 的过程中,大家几乎都遇到过 SQL 变慢的问题,尤其是查询相关的读变慢问题。读变慢的问题大部分情况下都遵循一定的规律,通过经验的积累可以快速的定位和优化ÿ…...

【ES6】Getter和Setter
JavaScript中的getter和setter方法可以用于访问和修改对象的属性。这些方法可以通过使用对象字面量或Object.defineProperty()方法来定义。 以下是使用getter和setter方法的示例: <!DOCTYPE html> <script>const cart {_wheels: 4,get wheels(){retu…...

3DS Max中绘制圆锥箭头
3DS Max中绘制圆锥箭头 绘制结果绘制过程步骤一:绘制立体圆锥方法1方法2 步骤二:圆锥体调参(模型尺寸设置)1圆锥体参数说明2圆锥体参数调整 步骤三:绘制圆柱体步骤四:圆柱体调参步骤五:圆锥与圆…...

虚拟机Ubuntu20.04 网络连接器图标开机不显示怎么办
执行以下指令: sudo service network-manager stop sudo rm /var/lib/NetworkManager/NetworkManager.state sudo service network-manager start...

你真的知道什么是USB Server吗?一分钟了解
很多公司都在用USB Server,效率大幅提高,但也还有不少人不知道USB Server到底是什么、干嘛用的。 USB Serve是帮助企业远程连接和集中管控USB设备的服务器 它的主要用途就是异地远程连接USB。 如,虚拟化环境的加密狗、前置机连接࿰…...

Node.js 中间件是怎样工作的?
express自带路由功能,可以侦听指定路径的请求,除此之外,express最大的优点就是【中间件】概念的灵活运用,使得各个模块得以解耦,像搭积木一样串起来就可以实现复杂的后端逻辑。除此之外,还可以利用别人写好…...

Spring MVC: 请求参数的获取
Spring MVC 前言通过 RequestParam 注解获取请求参数RequestParam用法 通过 ServletAPI 获取请求参数通过实体类对象获取请求参数附 前言 在 Spring MVC 介绍中,谈到前端控制器 DispatcherServlet 接收客户端请求,依据处理器映射 HandlerMapping 配置调…...
别再头疼反弹Shell失败了,这篇文章带你找到问题根源
别再头疼反弹Shell失败了,这篇文章带你找到问题根源 在渗透测试中,反弹shell失败的原因可以有多种。以下是一些常见的原因: **1.防火墙和网络过滤器:**目标系统可能配置了防火墙或网络过滤器,以限制对外部系统的连接…...

第五章 树与二叉树 四、线索树(手算与代码实现)
一、定义 1.线索树是一种二叉树,它在每个节点上增加了两个指针,分别指向其前驱和后继。 2.这些指针称为“线索”,因此线索树也叫做“线索化二叉树”。 3.在线索树中,所有的叶子节点都被线索化,使得遍历树的过程可以…...
服务器前后端学习理解
个人兴趣,突然想起来记录一下 1. 背景 想做一个最简单的网页,点击按钮后,访问服务器的redis数据库,读取一个为hello的值并显示 首先用js写了一个脚本,使用redis包,读取到了数据,并使用consol.l…...

python-数据分析-numpy、pandas、matplotlib的常用方法
一、numpy import numpy as np1.numpy 数组 和 list 的区别 输出方式不同 里面包含的元素类型 2.构造并访问二维数组 使用 索引/切片 访问ndarray元素 切片 左闭右开 np.array(list) 3.快捷构造高维数组 np.arange() np.random.randn() - - - 服从标准正态分布- - - …...

ChatGPT⼊门到精通(5):ChatGPT 和Claude区别
⼀、Claude介绍 Claude是Anthropic开发的⼀款⼈⼯智能助⼿。 官⽅⽹站: ⼆、Claude能做什么 它可以通过⾃然语⾔与您进⾏交互,理解您的问题并作出回复。Claude的主要功能包括: 1、问答功能 Claude可以解答⼴泛的常识问题与知识问题。⽆论是历史上的某个事件,理科…...

ChatGPT 总结数据分析的所有知识点
ChatGPT功能非常多,特别是对某个行业,某个方向,某个技术进行总结那是相当专业的。 如下图。 直接用一个指令便总结出来数据分析当中的所有知识点内容。 AIGC ChatGPT ,BI商业智能, 可视化Tableau, PowerBI, FineReport, 数据库Mysql Oracle, Office, Python ,ETL Ex…...

hadoop-HDFS
1.HDFS简介 2.1 Hadoop分布式文件系统-HDFS架构 2.2 HDFS组成角色及其功能 (1)Client:客户端 (2)NameNode (NN):元数据节点 管理文件系统的Namespace元数据 一个HDFS集群只有一个Active的NN ÿ…...

0202hdfs的shell操作-hadoop-大数据学习
文章目录 1 进程启停管理2 文件系统操作命令2.1 HDFS文件系统基本信息2.2 介绍2.3 创建文件夹2.4 查看指定文件夹下的内容2.5 上传文件到HDFS2.6 查看HDFS文件内容2.7 下载HDFS文件2.8 HDFS数据删除操作 3 HDFS客户端-jetbrians产品插件3.1 Big Data Tools 安装3.2 配置windows…...
生活小记-挂号信
"挂号信"通常指的是在邮寄过程中通过挂号邮寄服务寄送的信件,相对于普通信件有一些特殊的特点和服务。以下是挂号信与其他信件(例如普通信件)之间的区别: 跟踪和确认: 挂号信:通过挂号邮寄服务寄…...
3D点云处理:基于PCA的计算点云位姿(占位待整理)
文章目录 文章目录:3D视觉个人学习目录微信:dhlddxB站: Non-Stop_...

本地私有仓库、harbor私有仓库部署与管理
本地私有仓库、harbor私有仓库部署与管理 一、本地私有仓库1.本地私有仓库简介2.搭建本地私有仓库3.容器重启策略介绍 二、harbor私有仓库部署与管理1.什么是harbor2.Harbor的特性3.Harbor的构成4.harbor部署及配置5.客户端测试 三、Harbor维护1.创建2.普通用户操作私有仓库3.日…...

尚硅谷SpringMVC (5-8)
五、域对象共享数据 1、使用ServletAPI向request域对象共享数据 首页: Controller public class TestController {RequestMapping("/")public String index(){return "index";} } <!DOCTYPE html> <html lang"en" xmln…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
DiscuzX3.5发帖json api
参考文章:PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下,适配我自己的需求 有一个站点存在多个采集站,我想通过主站拿标题,采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...

Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...
从零手写Java版本的LSM Tree (一):LSM Tree 概述
🔥 推荐一个高质量的Java LSM Tree开源项目! https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree,专为高并发写入场景设计。 核心亮点: ⚡ 极致性能:写入速度超…...