【c++5道练习题】②

news2024/12/24 2:36:55

目录

 一、验证回文串

二、字符串相加

三、杨辉三角

四、最小栈

五、栈的压入、弹出序列 


 一、验证回文串

 思路:

1、注:for(auto ch : s)  -》指将s中每一个字符赋值给ch,ch的改变并不会影响s

但写为for(auto& ch : s) -》指将ch是s中每一个字符的引用,ch的改变影响s

2、将字符串中大写都转为小写或小写都转为大写,那判断是否为字母时,只需判断是否为小写字母即可,但这点最好的点在于比较字母时可以直接比较,因为都是统一的字母。

3、在走的过程中begin<end是因为如果一直没遇到字母和数字字符,不能让他一直走,走到尾要结束

代码如下: 

class Solution {
public:
	//判断是否为字母或数字
	bool isCharOrNumber(char ch)
	{
		if ((ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9'))
			return true;
		else
			return false;
	}
	//验证回文串
	bool isPalindrome(string s) {
		//1、将字符串中所有的大写字母转成小写
		for (auto& ch : s)
		{//取别名才能改变ch
			if (ch >= 'A' && ch <= 'Z')
			{
				ch += 32;
			}
		}
		//2、用快排的思路进行比较
		int begin = 0, end = s.size() - 1;
		while (begin < end)
		{//比较的大前提是begin < end

			while (begin < end && !isCharOrNumber(s[begin]))
				++begin;//若不是字母或数字则begin++往后找
			while (begin < end && !isCharOrNumber(s[end]))
				--end;//若不是字字母或数字则end--往前找

			//找到字母或数字了则开始比较
			if (s[begin] != s[end])
			{
				return false;
			}
			else
			{
				++begin;
				--end;
			}
		}
		return true;
	}
	
};

二、字符串相加

题目的意思是字符串变为整数相加后又变为字符串的形式 ,那这个字符串是多少?不允许字符串直接全转换为整形后相加,因为如果这个字符串很长,转换是存不下的

先给代码后说思路:

class Solution {
public:
	string addString(string num1, string num2) {
		//end1和end2从两个字符串的最后一位开始往前比
		int end1 = num1.size() - 1, end2 = num2.size() - 1;
		int next = 0;//用来保存是否进一位
		string retstr;//此字符串用来保存结果并返回
		while (end1 >= 0 || end2 >= 0)
		{//两个字符串都结束了才算结束
			int val1 = 0, val2 = 0;
			if (end1 >= 0)//>=0说明没走完,因为存在一个字符串走完另个字符串没走完的情况
				val1 = num1[end1] - '0';//将字符转换为数字

			if (end2 >= 0)
				val2 = num2[end2] - '0';

			int ret = val1 + val2 + next;//转换成的数字相加
			if (ret > 9)
			{
				ret -= 10;//>9则需要进位
				next = 1;//进位出来的1
			}
			else
			{//加出来的那一位ret<=9则无需进位,next=0
				next = 0;
			}

			//retstr.insert(retstr.begin(), '0' + ret);
			ret += (ret + '0');//再把这一位转换为字符尾插到ret末尾
			--end1;//--来进行前一位的相加
			--end2;
		}
		if (next == 1)
		{//在最后一次若next==1,尾插一个'1'
			//retstr.insert(retstr.begin(), '1');
			retstr += '1';
		}
		
		//因为之前是尾插的,那正确的字符串应该逆置
		reverse(retstr.begin(), retstr.end());

		return retstr;
	}
};

思路:

对于两个字符串从后往前一位一位进行相加,当然,字符不能直接相加,我们先把每一位对应的字符先转换为数字相加,如果加出来的这一位>9,则next=1(next用来表示是否进位) ,若<9,则next=0,当前一位的对应字符相加时就要加上next,进不进位就由next来区分

代码中的剖析:

 ①、while结束条件是end1 >= 0 || end2 >= 0  因为给的字符串可能一个长一个短,只有长的也结束了相加才结束,所以用或,end1和end2原来给的是字符串最后一个字符的下标,若end1<0说明end1对应的字符串走完了,end2同理

②、走的过程中要判断end1和end2是否>=0,因为存在一个字符串长一个字符串短的情况,长的没走完还要进入循环中,短的字符串走完了就不用计算了,所以如果>=0说明还没走完,要继续计算

③、字符的插入方式:

1、用insert来头插,但头插需要每次都向后移动,现有几个元素就需移几次,每次都头插一个元素,有一个元素需移动一次,两个元素需要移动两次,n个元素需要移动n次,1+2+...+n,故时间复杂度:O(N*N),效率不好

2、每插入一个元素都尾插,最后全尾插完再用algorithm中的reverse实现(需#include<algorithm>),时间复杂度:O(N),故推荐此方式

下面给出一个例子:

三、杨辉三角

题述:

 给定一个非负整数 numRows,生成杨辉三角的前 numRows行。

示例:

题中已给:

class Solution {
public:
	vector<vector<int>> generate(int numRows) {

	}
};

 知识点:理解vector<vector<int>>vv

思路: 

对于杨辉三角的实际状态,除了1外,每个数=上一行同下标的数+上一行同下标-1的数,而每一行的首元素和尾元素都会是1,利用这个规律就好求解了 

代码如下:

class Solution {
public:
	vector<vector<int>> generate(int numRows) {
		vector<vector<int>> vv;
		vv.resize(numRows);//开辟numRows个(行)
		for (size_t i = 0; i < numRows; ++i)
		{
			vv[i].resize(i + 1);//每一行对应开i+1个
			vv[i][0] = 1;//每一行的第一个元素为1
			vv[i][vv[i].size() - 1] = 1;//每一行的最后一个元素为1
		}

		for (size_t i = 0; i < vv.size(); ++i)
		{
			for (size_t j = 0; j < vv[i].size(); ++j)
			{
				if (vv[i][j] != 1)
				{//不是首尾元素的,则等于上一行同列下标+同列下标-1的值
					vv[i][j] = vv[i - 1][j] + vv[i - 1][j - 1];
				}
			}
		}

		return vv;
	}
};

四、最小栈

题述:

设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。

  • push(x)—— 将元素 x 推入栈中。
  • pop()—— 删除栈顶的元素。
  • top()—— 获取栈顶元素。
  • getMin()—— 检索栈中最小元素

输入:["MinStack","push","push","push","getMin","pop","top","get"]

[[ ],[-2],[0],[-3],[ ],[ ],[ ],[ ]]

输出:

[null,null,null,null,-3,null,0,-2]

题中已给:

class MinStack {
public:
	/* initialize your data with structure here */
	MinStack() {

	}
	
	void push(int x) {

	}

	void pop() {

	}

	int top() {

	}

	int getMin() {

	}
};

思路:

①、错误思路:

用两个栈,假设为栈A栈BA用来把所有元素一个个入栈B用来存最小元素

假如A中要存数据5 2 1 6,那么初始先入5到B,再考虑2,2比5小,删除B的栈顶,再把2入B,再考虑1,1比2小,删除B的栈顶,再把1入B,再考虑6,6没2小,不入B,那么B中最小的就是栈顶

但是若删除A中数据呢,B也受影响?栈一定是从栈顶开始删的,删除完后再找最小的元素就找不到了,因为之前的都被删除了。但是可以再遍历一遍A,再找最小元素,但这不符合题目规定的常数时间了,故这种方法不可以

②、正确思路:

用两个栈,假设为栈A栈B,跟错误思路的区别就是,B中不是只存最小的元素,而是在每次比较中,只要比B当前的栈顶元素小或等于的都入B,不删除之前的元素,那么再删除栈顶的时候,只有当B中和A中的元素相同时,才会删除B的栈顶,删除完后的栈顶还是当前最小的元素

 代码如下:

//最小元素
class MinStack {
public:
	/* initialize your data with structure here */
	MinStack() {}//因为栈是自定义类型,他有自己的构造函数,故构造函数可不写
	
	void push(int x) {
		_st.push(x);//_st的所有数据都会入栈
		if (_minst.empty() || _minst.top() >= x)
		{//只有当没数据或栈顶的元素>=要入的数据时,才会入_minst

		//重复的最小元素也要入_minst,因为假设有0 1 0三个数先后入_st,那如果
		// 不重复入minst,_minst只有0,当删除0时,_minst为空,再访问最小元素就
		// 没有了,但理应还返回0,所以重复的元素也要入栈
			_minst.push(x);
		}
	}
	
	void pop() {
		if (_st.top() == _minst.top())
			_minst.pop();

		_st.pop();
	}

	int top() {
		return _st.top();
	}

	int getMin() {
		return _minst.top();
	}

	stack<int> _st;//所有数据都入栈
	stack<int> _minst;//每次的更小值入栈
};

五、栈的压入、弹出序列 

题述:

题意是入栈的顺序是固定的,但出栈有好几种顺序,因为可以边进边出,pushV储存的入栈的元素,popV指的是出栈的元素

思路:

在已知出栈顺序的前提下,定义一个栈st,开始先入一个数据到st中,入完一个数据立即比较,比较跟出栈顺序的第一个元素是否相等,相等则出栈,然后比较下一元素,不相等则再入数据到栈中

注意①:出栈是个while循环操作,条件是栈不为空st中的栈顶=此时popV指向的当前元素才行,栈不为空才出栈因为可能在连续出栈的过程中栈为空了,这时应该再入数据

注意②:入栈直到栈数据全入完了才终止,那么入完了就可以判断顺序是否合法,此时只要栈中还有数据就是不合法没数据才合法,因为只有出栈入栈的顺序合法才会为空

 代码实现:

class Solution {
public:
	bool IsPopOrder(vector<int>pushV, vector<int>popV) {
		//栈来模拟进出 (用vector类似于用了c语言中的数组)
		stack<int> st;
		int pushi = 0, popi = 0;//入栈和出栈的下标
		while (pushi < pushV.size())//当走到尾就可判定了,但在这之前都要入栈
		{
			st.push(pushV[pushi]);//入数据
			++pushi;
			//入完一个数据就要立即跟已给的出栈顺序比较
			//因为可能要连续出,所以用while循环
			while (!st.empty() && st.top() == popV[popi])
			{
			//1、出到空就不能再出了,要退出while
			//2、若栈顶和已给的出栈顺序的对应位置相同,则进入while
				st.pop();
				++popi;
			}
		}

		//只有入栈的数据全部进入,且最后栈为空就是合法的顺序
		return st.empty();//若为空,则为合法的顺序
	}
};

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

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

相关文章

【部署】Nginx部署前后端JeecgBoot-Vue3

部署运维 前言前台部署配置服务器地址配置路由访问规则配置后端接口路由访问规则Linux 宝塔傻瓜式部署前台项目 Nginx 命令 前言 前面有提到使用 Window 的 IIS 管理器来部署打包后的前端项目&#xff0c;点击【原文】 跳转到前篇文章。感觉甲方爸爸的描述&#xff0c;似乎有些…

Smartbi吴华夫:后疫情时代,BI发展趋势的观察与应对

沿着旧地图找不到新大陆&#xff0c;“基于指标体系的可视化分析和增强分析”成为BI发展新阶段。Smartbi V11系列新品与时俱进&#xff0c;以指标为核心&#xff0c;同时融合BI应用&#xff0c;赋能管理者和业务&#xff0c;成为引领数字化运营的新航标&#xff01; ——思迈特…

Zabbix监控平台环境部署

Zabbix监控平台环境部署 1.Linux环境部署 hostnamectl set-hostname zabbix_server #修改主机名方便查看 hostnamectl set-hostname zabbix_agent ​ systemctl stop firewalld #关闭防火墙 systemctl disable firewalld #关闭防火墙开机自启 setenforce 0 #关闭SElinu…

微信怎么给自己发消息

前段时间看到一份数据调查&#xff0c;说是到目前为止&#xff0c;全球使用微信的用户已达到10亿多人次&#xff0c;天啊&#xff0c;多么强大的用户群体&#xff01; 这么多人喜欢使用微信&#xff0c;相信大家都知道&#xff0c;微信里面有一个特俗功能&#xff0c;可以自己…

逆向-attack之改写函数的返回地址

#include <stdio.h> #include <stdlib.h> #include <unistd.h> /* * 改写input()函数的返回地址&#xff0c;从而使得breakout()函数在没有直接调用的情况下获得执行 */ void breakout() { puts("Welcome. Have a shell..."); system(…

argparse--命令行参数解析库

文章目录 位置参数help ->描述信息type -> 被转换的类型 可选参数action ->动作基本类型 (store_true)短选项 结合位置参数和可选参数choiceaction ->动作基本类型 (count)default -> 默认值 argparse模块使编写用户友好的命令行变得容易 接口。程序定义了它需要…

6.网络编程套接字(下)

文章目录 4.TCP流套接字编程4.1ServerSocket API4.2Socket API4.3TCP中的长短连接4.4示例一&#xff1a;一发一收&#xff08;长连接&#xff09;4.4.1TCP服务端4.4.2TCP客户端 4.5示例二&#xff1a;请求响应&#xff08;短连接&#xff09;4.5.1TCP服务端4.5.2TCP客户端 4.6再…

32 WEB漏洞-文件操作之文件下载读取全解

目录 介绍利用获取数据库配置文件文件名&#xff0c;参数值&#xff0c;目录符号 涉及案例:Pikachu-文件下载测试-参数Zdns-文件下载真实测试-功能点小米路由器-文件读取真实测试-漏洞RoarCTF2019-文件读取真题复现-比赛百度杯2017二月-Zone真题复现-比赛拓展 下载和读取都差不…

开源大模型ChatGLM2-6B 1. 租一台GPU服务器测试下

0. 环境 租用了1台GPU服务器&#xff0c;系统 ubuntu20&#xff0c;GeForce RTX 3090 24G。过程略。本人测试了ai-galaxy的&#xff0c;今天发现网友也有推荐autodl的。 &#xff08;GPU服务器已经关闭&#xff0c;因此这些信息已经失效&#xff09; SSH地址&#xff1a;* 端…

循环购模式:一种新型的电商模式,让你的生意更轻松

你是否想过&#xff0c;你的商品能够以一种更高效、更环保、更有趣的方式销售给顾客&#xff1f;你是否想过&#xff0c;你的顾客能够以一种更低成本、更高回报、更多互动的方式享受你的商品&#xff1f;如果你的答案是肯定的&#xff0c;那么你一定要了解一下循环购模式。 循环…

TestFlight填写测试信息Beta版App审核信息报错确保联系人电话号码只包含数字,然后重试。

在TestFlight填写测试信息时 Beta版App审核信息报错确保联系人电话号码只包含数字&#xff0c;然后重试。 看到这个报错一脸懵逼&#xff0c;我明明电话号码填写就是纯数字啊。更换了浏览器也是无效&#xff0c;后面发现这个错误提示描述有问题&#xff0c;并不是要求只包含数字…

R语言并行计算提高速度丨parallel包和foreach包

并行计算提高R语言速度 今天与大家分享的是R语言中的并行计算的内容&#xff0c;将探讨如何使用parallel和foreach包在R中进行并行计算&#xff0c;以及在不同情况下提高计算效率的方法。 目标&#xff1a;让计算等待时间缩短&#xff01; 1. 什么是并行计算&#xff1f; 并行计…

认识网线上的各种参数标号

最近工作需要&#xff0c;接触了很多不同类型的网线&#xff0c;为了能够区分不同型号的网线&#xff0c;特意做一篇笔记用来学习&#xff0c;如有记录有误之处&#xff0c;欢迎大家指正~初步认识网线 常用的网络电缆有三种&#xff1a;双绞线、同轴电缆和光纤电缆&#xff08…

Vue3、Vite使用 html2canvas 把Html生成canvas转成图片并保存,以及填坑记录

这两天接到新需求就是生成海报分享&#xff0c;生成的格式虽然是一样的但是自己一点点画显然是不符合我摸鱼人的性格&#xff0c;就找到了html2canvas插件&#xff0c;开始动工。 安装 npm install html2canvas --save文档 options 的参数都在里面按照自己需求使用 https://a…

Python3.10 IDLE更换主题

前言 自定义主题网上有很多&#xff0c;3.10IDLE的UI有一些新的东西&#xff0c;直接扣过来会有些地方覆盖不到&#xff0c;需要自己测试着添几行配置&#xff0c;以下做个记录。 配置文件路径 Python安装目录下的Lib\idlelib\config-highlight.def。如果是默认安装&#xf…

2023年7月京东平板电脑行业品牌销售排行榜(京东销售数据分析)

鲸参谋监测的京东平台7月份平板电脑市场销售数据已出炉&#xff01; 根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;今年7月份&#xff0c;京东平台上平板电脑的销量为68万&#xff0c;同比增长超过37%&#xff1b;销售额为22亿&#xff0c;同比增长约54%。从价格上看…

win11本地连接没了怎么办

很多用户在使用win11系统时发现自己的网络连接没有了&#xff0c;遇到这种情况的话&#xff0c;我们应该怎么处理呢&#xff1f;我们可以尝试打开网络图标&#xff0c;下面就是小编整理出的教程&#xff0c;大家一起看看吧。 win11本地连接没了怎么办 方法一&#xff1a; 1、…

Python基于Flask的招聘信息爬取,招聘岗位分析、招聘可视化系统

Python基于Flask招聘信息可视化系统 一、介绍 今天为大家带来的是Python基于Flask的招聘信息爬取&#xff0c;招聘岗位分析、招聘可视化系统。视频演示地址&#xff1a;https://www.bilibili.com/video/BV1Tp4y1A7nW/ Python基于flask的招聘数据可视化&#xff0c;招聘岗位分…

Cpp/Qtday050912cpp基础

目录 实现一个图形类&#xff08;Shape&#xff09;&#xff0c;包含受保护成员属性&#xff1a;周长、面积&#xff0c; 公共成员函数&#xff1a;特殊成员函数书写 定义一个圆形类&#xff08;Circle&#xff09;&#xff0c;继承自图形类&#xff0c;包含私有属性&#x…

YoloV8改进策略:Diverse Branch Block改进YoloV8,继续在重参数结构上恐龙抗狼

摘要 DBB(Diverse Branch Block)是一种类似Inception的多分支结构,用于网络结构重参数化。它通过多分支结构类型更丰富(多尺度卷积、平均池化等),感受野更多样性,各操作具有不同的计算复杂度,因此更具有通用性,可以用来替换单个卷积进行训练。在训练阶段,对模型中的…