PAT乙级1003我要通过的做题笔记
分析题意
得到“答案正确”的条件是:
字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;
任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。
根据题目中的规则,如果aPbTc是正确的,那么aPbATca也是正确的。这里我们可以把字符串中P之前的A的个数看作x,P和T之间的A的个数看作y,T之后的A的个数看作z。
对于初始的合法字符串xPATx,这里x可以为空字符串或者仅由A组成的字符串,此时有x个A在P之前,1个A在P和T之间,x个A在T之后,满足x * 1=x的关系。
当按照规则扩展时,比如从aPbTc变为aPbATca,如果P之前A的个数为a,P和T之间A的个数从b变为b + 1,T之后A的个数从c变为c + a。这种变化始终保持着a * b=c的关系(在原始的xPATx中就是x * 1=x)。
总之就是:只有P,A,T三种字符,PT之间必须有A,P前面的A * PT之间的A == T之后的A
代码思路
确定字符种类
要检测只有三种字符,还有统计其中A,P,T的个数,可以想到利用键值对map,分别检测字符和字符数量,那么就创建一个map<char ,int>类型的键值对变量m。
我们就可以通过遍历字符串的每个字符的方式,来确定字符种类数,和每种字符的个数。
确定A的数量关系
要确定A的数量关系,可以利用下标(索引)来求,我们可以发现字符串索引从0开始,那么P之前A的个数就可以用P的下标来代表,那么我们在循环中一旦遍历到’P’,我们就把它的下标存到一个变量p中作为P前面A的个数。
PT之间
T的索引 - P的索引再减去1.比如
PTA
012
2 - 0 - 1 = 1,1为PT间A的个数
T之后A的个数
字符串长度 - T的索引 - 1
PTAAAA
0123456
6 - 1 - 1 = 4为T之后A的个数
P和T之间必须有A
那么P和T的索引之差就不能小于1
只有P,A,T三种字符
那么m.size() == 3,如果还有多的或者是不足三种,m.size()就不为3了
m.size()代表的是这个键值对中字符种类的个数
P,T个数只有一个
那么,m[‘P’] == 1, m[‘T’] == 1
代码实现
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main()
{string s;int n = 0;int t = 0;int p = 0;cin >> n;int i = 0;for (i = 0; i < n; i++){cin >> s;map <char, int> m;int j = 0;for (j = 0; j < s.size(); j++){m[s[j]]++;//统计字符种类数,以及每种字符的个数if (s[j] == 'P'){p = j;}if (s[j] == 'T'){t = j;}}if (m['T'] == 1 && //T只有一个m['P'] == 1 && //P只有一个m.size() == 3&& //只有P,A,T三种字符t - p > 1 && //P和T之间必须有Am['A'] != 0 &&//A的个数不为0p * (t - p - 1) == s.length() - t - 1//P前的A * PT间的A == T后的A){cout << "YES" << endl;}else{cout << "NO" << endl;}}return 0;
}
自己写的错误
将if (s[j] == ‘P’)写成if (m[s[j]]==‘P’)
分析
- 原意
- 当代码为
if (s[j]=='P') p = j;时,它的原意是检查字符串s中的第j个字符是否为'P'。如果是,就将j的值赋给变量p,这里p很可能是用来记录字符'P'在字符串中的位置索引。
- 当代码为
- 错误写法的影响及区别
- 当写成
if (m[s[j]]=='P') p = j;时:- 首先,
m是一个map<char, int>类型,m[s[j]]会返回一个int类型的值(这个值是字符s[j]在m中的计数)。而'P'是一个字符常量。在C++ 中,将一个int类型的值与一个字符常量进行比较是类型不匹配的操作。 - 这种错误写法会导致程序逻辑混乱。因为它不是在检查字符串中的字符是否为
'P',而是在检查字符s[j]在m中的计数是否等于字符'P'的ASCII码值(实际上由于类型不匹配,这种比较没有实际意义)。这与原代码的功能完全不同,原代码是在寻找字符串中'P'字符的位置,而错误写法是在对一个不相关的计数进行无意义的比较。
- 首先,
- 当写成
map<char, int> m不放入循环
分析
- 作用域与数据复用问题
- 如果将
map<char, int> m;放在循环外面,每次循环不会重新创建一个新的m。 - 这可能导致数据复用问题。例如,在处理多个不同的输入字符串时,
m会累积之前字符串中字符的计数信息。如果第一个字符串是“PAT”,处理完后m['P'] = 1,m['A'] = 1,m['T'] = 1。当处理下一个字符串时,m已经有了之前的计数,这会干扰对新字符串中字符的正确统计。
- 如果将
- 逻辑错误
- 从逻辑上讲,程序可能会得到错误的结果。因为对于每个输入字符串,都应该独立地统计其中字符的出现次数。如果
m在循环外,就无法保证每个字符串的统计是独立的。例如,程序可能会错误地判断字符出现的次数或者满足某些条件的情况,如判断是否只有特定的字符(P、A、T)以及它们的数量关系是否符合要求等都会因为m的复用而得出错误的结论。
- 从逻辑上讲,程序可能会得到错误的结果。因为对于每个输入字符串,都应该独立地统计其中字符的出现次数。如果
漏写m[s[j]]++;
-
代码目的
- 在这段代码中,
m[s[j]]++;这行代码的目的是统计字符串中每个字符出现的次数。 - 这里
m是一个map<char, int>类型的容器,它的键是字符类型(char),值是整数类型(int)。 - 当执行
m[s[j]]++;时:- 如果
s[j]这个字符是第一次出现在字符串中,那么m[s[j]]会创建一个新的键值对,键为s[j],值初始化为0,然后执行++操作后,这个字符对应的计数就变为1,表示这个字符出现了1次。 - 如果
s[j]这个字符已经在之前出现过,那么m[s[j]]会直接找到对应的键值对,然后执行++操作,将这个字符的计数加1,表示这个字符又出现了一次。
- 如果
- 这样做是为了后续判断字符串中是否只有
P、A、T三种字符(通过m.size()==3判断)以及判断P、A、T的数量是否符合要求(例如m['P'] == 1等)。
- 在这段代码中,
-
计数功能缺失
- 如果没有
m[s[j]]++;这行代码,首先会导致字符计数功能无法实现。 - 假设
m是用于统计字符串中字符出现次数的map,原本这行代码会根据字符串中的字符s[j],在m中找到对应的键(如果不存在则创建),并将其对应的值加1。没有这行代码,就不能对字符串中的字符进行计数。
- 如果没有
-
后续判断错误
- 在程序后续可能存在对字符出现次数的判断逻辑。例如,可能需要判断某个字符是否只出现了特定的次数,或者判断不同字符出现次数之间的关系。
- 由于没有正确统计字符出现次数,这些判断都会得出错误的结果。例如,如果需要判断字符串中是否只有特定的三种字符(如
P、A、T)且数量关系符合某种规则,由于没有准确的计数,可能会错误地认为字符串满足或不满足条件。
代码引用
柳婼的代码
相关文章:
PAT乙级1003我要通过的做题笔记
分析题意 得到“答案正确”的条件是: 字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符; 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串࿱…...
【React】React常用开发工具
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、React DevTools二、Redux DevTools三、Create React App 前言 React 是一种用于构建用户界面的流行 JavaScript 库,由于其灵活性、性能和可重用…...
Ubuntu20.04编译安装Carla全过程
前言 Carla的安装是我现阶段解决的第一个问题,现记录一下我安装Carla的过程以及我在安装过程中遇到的一些问题。 一、安装前准备 1、硬件环境 carla是一款基于UE4开发的模拟仿真软件,本身对硬件的要求比较高。 我是windows与ubuntu双系统࿰…...
Dijkstra 算法 是什么?
Dijkstra 算法 Dijkstra 算法是一种经典的最短路径算法,用于在图(有向或无向图)中找到从起点到其他所有节点的最短路径。它以广度优先搜索的方式,逐步扩展到目标节点,确保计算出的路径是最短的。 1. Dijkstra 算法的基…...
英文输入法---华为OD机试2024年E卷
题解: 代码:...
理解 package.json 中版本号符号
今天,聊一聊在前端开发中, package.json 中怎么看版本号符号。 版本号符号的解释 版本号通常由三部分组成:主版本号、次版本号、补丁版本号,格式为 major.minor.patch。常见的符号有: ^:更新时允许自动…...
计算机网络-IPSec VPN基本概念
企业分支之间经常有互联的需求,企业互联的方式很多,可以使用专线线路或者Internet线路。部分企业从成本和需求出发会选择使用Internet线路进行互联,但是使用Internet线路存在安全风险,如何保障数据在传输时不会被窃取?…...
VsCode运行Ts文件
1. 生成package.json文件 npm init 2. 生成tsconfig.json文件 tsc --init 3. Vscode运行ts文件 在ts文件点击右键执行Run Code,执行ts文件...
模型 AITDA(吸引、兴趣、信任、渴望、行动)
系列文章 分享 模型,了解更多👉 模型_思维模型目录。吸引、兴趣、信任、渴望、行动 五步曲。 1 模型AITDA的应用 1.1 开源AI智能名片小程序的营销策略 一家企业开发了开源AI智能名片小程序,旨在通过S2B2C模式连接供应商和消费者。该企业采用…...
十、软件设计架构-微服务-服务调用Feign
文章目录 前言一、Feign介绍1. 什么是Feign2. 什么是Http客户端3. Feign 和 OpenFeign 的区别 二、Feign底层原理三、Feign工作原理详解1. 动态代理机制2. 动态代理的创建过程3. 创建详细流程4. FeignClient属性 四、Feign使用1. 常规调用2.日志打印3. 添加Header 前言 服务调…...
电子商务人工智能指南 3/6 - 聊天机器人和客户服务
介绍 81% 的零售业高管表示, AI 至少在其组织中发挥了中等至完全的作用。然而,78% 的受访零售业高管表示,很难跟上不断发展的 AI 格局。 近年来,电子商务团队加快了适应新客户偏好和创造卓越数字购物体验的需求。采用 AI 不再是一…...
【AI模型对比】Kimi与ChatGPT的差距:真实对比它们在六大题型中的全面表现!
文章目录 Moss前沿AI语义理解文学知识数学计算天文学知识物理学知识英语阅读理解详细对比列表总结与建议 Moss前沿AI 【OpenAI】获取OpenAI API Key的多种方式全攻略:从入门到精通,再到详解教程!! 【VScode】VSCode中的智能AI-G…...
spring6:2入门
spring6:2入门 目录 spring6:2入门2.1、环境要求2.2、构建模块2.3、程序开发2.3.1、引入依赖2.3.2、创建java类2.3.3、创建配置文件2.3.4、创建测试类测试2.3.5、运行测试程序 2.4、程序分析2.5、启用Log4j2日志框架2.5.1、Log4j2日志概述2.5.2、引入Log…...
Netty - NIO基础学习
一 简介 1 三大模型是什么? IO三大模型之一,BIO,AIO,还有我们的主角NIO(non-blocking-io),也就是同步非阻塞式IO。这三种模型到底是干什么的?其实这三种模型都是对于JAVA的一种I/O框架,用来进行…...
ArrayList的自动扩容机制源码
Java的ArrayList的自动扩容机制 ArrayList是 Java 中极为常用的动态数组实现类,它依托数组存储数据,能依据实际需求灵活变动容量,高效管理元素集合。在深挖底层源码细节前,先来了解创建ArrayList集合并添加元素时的运作流程&#…...
【llm_inference】react框架(最小code实现)
ReAct:结合推理和行动的大语言模型推理架构 GitHub Code: 人人都能看懂的最小实现 引言 在人工智能领域,大语言模型(LLM)的应用日益广泛,但如何让模型能够像人类一样,在思考的基础上采取行动,…...
PT8M2103 触控 I/O 型 8-Bit MCU
1 产品概述 ● PT8M2103 是一款可多次编程(MTP)I/O 型8位 MCU,其包括 2K*16bit MTP ROM、256*8bit SRAM、PWM、Touch 等功能,具有高性能精简指令集、低工作电压、低功耗特性且完全集成触控按键功能。为各种触控按键的应用,提供了一种简单而又…...
英语时态学习+名词副词形容词变形方式
开发出头不容易 不如跨界卷英语 英语中的16种时态是由四种时间(现在、过去、将来、过去将来)和四种体(一般、进行、完成、完成进行)组合而成的。以下是每种时态的详细说明和例句: 一般现在时 (Simple Present) 用法…...
浏览器解析页面流程
从输入一个url到页面解析完成的流程 1. 网络进程 1. 获取url 浏览器首先判断输入的url是否有http缓存,如果有则直接从http缓存中读取数据并显示。如果没有,则进行下一步。进行DNS解析,获取域名对应的IP地址。 2.下载html文件 浏览器根据I…...
图的遍历之DFS邻接矩阵法
本题要求实现一个函数,对给定的用邻接矩阵存储的无向无权图,以及一个顶点的编号v,打印以v为起点的一个深度优先搜索序列。 当搜索路径不唯一时,总是选取编号较小的邻接点。 本题保证输入的数据(顶点数量、起点的编号等…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
