PAT甲级 字符串处理题_C++题解
字符串处理题
目录
- 《算法笔记》 重点摘要
- 1001 A+B Format (20)
- 1005 Spell It Right (20)
- 1108 Finding Average (20)
- 1132 Cut Integer (20)
- 1140 Look-and-say Sequence
《算法笔记》 3.6 字符串处理 重点摘要
- 注意分析输入输出格式
- 注意细节和边界情况
1001 A+B Format (20)
#include<iostream>
using namespace std;
int main()
{
int a, b, sum;
cin >> a >> b;
sum = a + b > 0 ? a + b : -(a + b);
if (a + b < 0) cout << "-";
string s = to_string(sum);
if (s.length() > 3){
for (int i = s.length()-3; i > 0; i = i - 3) s.insert(i, ",");
cout << s << endl;
}
else cout << sum << endl;
return 0;
}
string.insert (pos, str);
在 pos 位置插入 str
1005 Spell It Right (20)
#include<iostream>
using namespace std;
int main()
{
string words[10] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
string N;
cin >> N;
int sum = 0;
for (int i = 0; i < N.length(); i++) sum += stoi(N.substr(i,1));
string s = to_string(sum);
cout << words[stoi(s.substr(0,1))];
for (int i = 1; i < s.length(); i++) cout << " " << words[stoi(s.substr(i,1))];
return 0;
}
- string 转 int:
stoi()
- s[i] 是char,不符合参数要求,用 s.substr(i,1) 返回子串即可
- int 转 string:
to_string()
1108 Finding Average (20)
题目思路
- 将输入先接收到字符串中
- 依序检查是否有非数字,注意负号和小数点合法,其他非数字出现即不合法
- 均为数字后,检查是否有小数点
- 无小数点则为整数
- 有小数点要分别检查是否有多个小数点(
s.find_first_of('.') != s.find_last_of('.')
)和小数位数是否超过2(s.length()-s.find('.') > 3
)
- 以上去掉格式不合法数字后,转化为double型,看是否在[-1000,1000]范围内,不在亦不合法
- 输出时注意区分 0、1(number单数) 及其他
#include<iostream>
using namespace std;
int main()
{
int n, num = 0;
cin >> n;
string s;
double data, sum = 0;
for (int i = 0; i < n; i++){
bool islegal = true;
cin >> s;
for (int j = 0; j < s.length(); j++){
if ((s[j]>'9' || s[j]<'0') && s[j]!='-' && s[j]!='.'){
cout << "ERROR: " << s << " is not a legal number\n";
islegal = false;
break;
}
}
if (islegal){
if (s.find('.') != string::npos){
if(s.find_first_of('.') != s.find_last_of('.') || s.length()-s.find('.') > 3){
cout << "ERROR: " << s << " is not a legal number\n";
continue;
}
}
data = stod(s);
if (data >= -1000 && data <= 1000){
sum += data;
num++;
}
else cout << "ERROR: " << s << " is not a legal number\n";
}
}
if (!num) cout << "The average of 0 numbers is Undefined";
else if (num == 1) printf("The average of 1 number is %.2f", num, sum);
else printf("The average of %d numbers is %.2f", num, sum/num);
return 0;
}
二刷(参考柳婼小姐姐的代码)
#include<iostream>
#include<cstring>
using namespace std;
int main(){
int n, k = 0;
scanf("%d", &n);
char s[50], t[50];
double num, sum = 0.0;
for (int i = 0; i < n; i++){
scanf("%s", s);
sscanf(s, "%lf", &num);
sprintf(t, "%.2f", num);
bool islegal = true;
for (int j = 0; j < strlen(s); j++)
if (s[j] != t[j]) islegal = false;
if (islegal && num >= -1000 && num <= 1000){
k++;
sum += num;
}
else printf("ERROR: %s is not a legal number\n", s);
}
if (!k) printf("The average of 0 numbers is Undefined\n");
else if (k == 1) printf("The average of 1 number is %.2f\n", sum);
else printf("The average of %d numbers is %.2f\n", k, sum / k);
return 0;
}
- sscanf() – 从一个字符串中读进与指定格式相符的数据
- sprintf() – 字符串格式化命令,主要功能是把格式化的数据写入某个字符串中
1132 Cut Integer (20)
#include<iostream>
using namespace std;
int main()
{
int n, z;
scanf("%d", &n);
for (int i = 0; i < n; i++){
scanf("%d", &z);
string s = to_string(z);
int len = s.length();
int a = stoi(s.substr(0,len/2));
int b = stoi(s.substr(len/2));
printf("%s", !b || z % (a * b) ? "No\n" : "Yes\n");
}
return 0;
}
- 注意 b 可能为 0 导致 a*b 为 0 发生取余 0 情况导致浮点错误
string.substr(pos)
可表示pos到end的子串
string substr (size_t pos = 0, size_t len = npos) const;
浮点错误
- 是否可能出现了一个数除以0的情况
- 是否可能出现了一个数取余0的情况
- 是否发生了数据溢出而导致的除以0或者取余0的情况
1140 Look-and-say Sequence
题目思路
- 依序遍历当前字符串,若s[j] == s[j+1],将记录s[j]数量的sum++;若不等,则说明s[j]为一串相同数字的末尾,此时将s[j]的内容和其个数sum压入新串next
- 注意遍历到串尾时,继续检查j+1会越界,由于每个s[j]的内容其实在上一次循环已经被检查过,且上一次循环记录的sum是此次循环对应值,可直接将串尾内容及sum压入next串
#include<iostream>
using namespace std;
int main()
{
int D, N;
cin >> D >> N;
string s = to_string(D);
for (int i = 1; i < N; i++){
string next;
int sum = 1;
for (int j = 0; j < s.length(); j++){
if (j == s.length()-1){
next.append(s.substr(j,1));
next.append(to_string(sum));
break;
}
if (s[j] == s[j+1]) sum++;
else{
next.append(s.substr(j,1));
next.append(to_string(sum));
sum = 1;
}
}
s = next;
}
cout << s << endl;
return 0;
}
二刷(参考柳婼小姐姐的代码)
- 遍历 s ,令 j 从当前位置 i 开始检查 s[j] 是否等于 s[i]
- 当 j 检查到与 s[i] 不同或到串尾时会停在第一个不与 s[i] 相同的点 或是 串尾+1,那么 j-i 即为与 s[i] 相同的个数。
- 将 s[i] 和个数 j-i 压入新串
- 令 i=j,即从与上一个 s[i] 不同点处继续检查。
#include<iostream>
using namespace std;
int main()
{
string s;
int n, j;
cin >> s >> n;
for (int k = 1; k < n; k++){
string t;
for (int i = 0; i < s.length(); i = j){
for (j = i; j < s.length() && s[j] == s[i]; j++);
t += s[i] + to_string(j - i);
}
s = t;
}
cout << s;
return 0;
}
PAT甲级 字符串处理题_C++题解的更多相关文章
- PAT甲级 散列题_C++题解
散列 PAT (Advanced Level) Practice 散列题 目录 <算法笔记> 重点摘要 1002 A+B for Polynomials (25) 1009 Product ...
- PAT甲级 Dijkstra 相关题_C++题解
Dijkstra PAT (Advanced Level) Practice Dijkstra 相关题 目录 <算法笔记>重点摘要 1003 Emergency (25) <算法笔记 ...
- PAT甲级 二叉树 相关题_C++题解
二叉树 PAT (Advanced Level) Practice 二叉树 相关题 目录 <算法笔记> 重点摘要 1020 Tree Traversals (25) 1086 Tree T ...
- PAT甲级 二叉查找树 相关题_C++题解
二叉查找树 PAT (Advanced Level) Practice 二叉查找树 相关题 目录 <算法笔记> 重点摘要 1099 Build A Binary Search Tree ( ...
- PAT甲级 图 相关题_C++题解
图 PAT (Advanced Level) Practice 用到图的存储方式,但没有用到图的算法的题目 目录 1122 Hamiltonian Cycle (25) 1126 Eulerian P ...
- PAT甲级 树 相关题_C++题解
树 目录 <算法笔记>重点摘要 1004 Counting Leaves (30) 1053 Path of Equal Weight (30) 1079 Total Sales of S ...
- PAT甲级 堆 相关题_C++题解
堆 目录 <算法笔记>重点摘要 1147 Heaps (30) 1155 Heap Paths (30) <算法笔记> 9.7 堆 重点摘要 1. 定义 堆是完全二叉树,树中每 ...
- PAT甲级 进制转换题_C++题解
进制转换题 PAT (Advanced Level) Practice 进制转换题 目录 <算法笔记> 重点摘要 1015 Reversible Primes (20) 1019 Gene ...
- PAT甲级 排序题_C++题解
排序题 PAT (Advanced Level) Practice 排序题 目录 <算法笔记> 6.9.6 sort()用法 <算法笔记> 4.1 排序题步骤 1012 The ...
随机推荐
- HNOI2009有趣的数列
首先next_permutation打表,发现Cat规律. 其实考试的时候这么做没什么问题,而且可以节省异常多的时间,那么现在我们来想一下why. 首先我拿模型法解释一下,我们把2n个数看成2n个人, ...
- Flask上下文源码分析(二)
前面第一篇主要记录了Flask框架,从http请求发起,到返回响应,发生在server和app直接的过程. 里面有说到,Flask框架有设计了两种上下文,即应用上下文和请求上下文 官方文档里是说先理解 ...
- 【翻译】JNA调用DLL
一.前言 Jna调用的示范,基本包括了Java->C基本类型的转换,指针的转换等. 不过文章是2011年的,可能后面要查看下有什么改变. 二.原文 http://www.viaboxxsyste ...
- Django 测试开发1
笔者用的版本的是django==1.8.2,这个版本的学习资料最多,文档最完整.首先创建项目:django-admin startproject 项目名. guest/__init__.py 一个空的 ...
- Python日志库logging总结-可能是目前为止将logging库总结的最好的一篇文章
在部署项目时,不可能直接将所有的信息都输出到控制台中,我们可以将这些信息记录到日志文件中,这样不仅方便我们查看程序运行时的情况,也可以在项目出现故障时根据运行时产生的日志快速定位问题出现的位置. 1. ...
- 【转】nodejs接收前端formData数据
很多时候需要利用formdata数据格式进行前后端交互. 前端代码可以是如下所示: <!DOCTYPE html> <html lang="en"> < ...
- HBase里配置SNAPPY压缩以后regionserver启动不了的问题
配置了HBase的SNAPPY压缩以后,出现regionserver启动不了的问题.分析应该是属性配置错了! 官网上的是:<name>hbase.regionserver.codecs&l ...
- jsp中cookie的一个报错
写项目时在一个jsp页面中使用了cookie,用逗号分隔的数据,服务器老报错,搞了一个小时,终于清楚了,jsp的cookie中不能使用逗号. cookie规则:这个规则用于jsp.asp中(下面这两句 ...
- 怎样创建一个OpenStack官方账号?
OpenStack官方账号分两种: 社区成员 (Community Member) 基金会成员 (Foundation Member) 基金会成员比社区成员的权利多一点: 允许提交峰会议题 允许对峰会 ...
- POPUP_GET_VALUES 金额字段不可编辑
转自:https://blog.csdn.net/huanglin6/article/details/102733845 当在POPUP_GET_VALUES函数中参考的字段是个货币或者金额字段的话, ...