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为起点的一个深度优先搜索序列。 当搜索路径不唯一时,总是选取编号较小的邻接点。 本题保证输入的数据(顶点数量、起点的编号等…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...
【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...
Android多媒体——音/视频数据播放(十八)
在媒体数据完成解码并准备好之后,播放流程便进入了最终的呈现阶段。为了确保音视频内容能够顺利输出,系统需要首先对相应的播放设备进行初始化。只有在设备初始化成功后,才能真正开始音视频的同步渲染与播放。这一过程不仅影响播放的启动速度,也直接关系到播放的稳定性和用…...
