Notes about PAT
1002
Analysis
- 求各数位和
数字除大数<直接利用string输入
for (int i = 0; i < s.length(); i++) sum += (s[i] - '0');
- 将数字转换为拼音
enum<<字符串数组记录
string str[10] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
- 输出的空格问题
判断末位<首位
for (int i = 0; i < num.length(); i++) { if (i != 0) cout << " "; cout << str[num[i] - '0']; }
- 序号性
数组指针-'0’
char_num[ssum[i]-'0']
- 序号性
Error/Warning
- length()符号性
for (unsigned int i = 0; i < sinput.length(); i++)
Summary
- \String类\数组
1003
https://blog.csdn.net/liuchuo/article/details/51994881?spm=1001.2014.3001.5502
Analysis
- 找规律
开头的A的个数 * 中间的A的个数 = 结尾的A的个数 - 二维存储
数组<map
for(int i = 0; i < n; i++) { cin >> s; map<char, int> m; for(int j = 0; j < s.size(); j++) { m[s[j]]++;
Error/Warning
-输出大小写
Gaps
对比70/20行
Summary
- map可用于记录字符个数
1004
Analysis
- 没有用map,而是for循环里直接一次比较
1005
Analysis
- 运用数组标记0/1,对应数字标记
arr[num]=1;
- 用flag来控制空格
if (flag == 1) cout << " "; cout << v[i]; flag = 1;
第一次后打空格
Gap
- vector的sort()的第三个参数为比较函数默认从小到大comp,可以自己写。
Error/Warning
-sort(v.begin(),v.end(),comp);
1006
Analysis
- 分解各数位并存入一个数组
int i=0;while (a != 0) { b[i++] = a % 10; a = a / 10; }
1007
Analysis
- 判断素数的函数思路:
bool isprime(int a) { for(int i=2;i*i<=a;i++) { if(a%i==0) return false; } return true; }
1008
Analysis
?如何用链表实现
eg.移动3位,次数最少
1 2 3 4 5 6 7 8 9->7 8 9 1 2 3 4 5 6
list1:1 2 3 4 5 6
list2:7 8 9
typedef list<int> LISTINT;
Error/Warning
- 未考虑M>N的情况。
解决办法:m=M%N代替原先M
1009
Error/Warning
- ?
if (const char(s_cin[i]) == ' ')
错误 C2446 “==”: 没有从“const char [2]”到“int”的转换
后来就好了? - ?[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NPNrkk81-1631279001764)(:/a8693424982f441e8044af5e36f84231)]
Analyse
- 还可以用stack的思维!
stack<string> v; string s; while(cin >> s) { v.push(s); } cout << v.top(); v.pop();
Gap
- string的输入
getline(cin,s_cin);
1011
- 格式化输出
long long int a, b, c; scanf("%lld%lld%lld", &a, &b, &c); printf("Case #%d: %s\n", i + 1, a + b > c ? "true" : "false");
1012
- ?小数点后一位
- ?A4为什么不对
1013
- 如何iterator指向第M个vector
it=v.begin()+M-1
- ?有一组数据错误
1014
-
!map key&value互找
`map<int,char > aMap;
/插入初始化的元素/
/*1.用insert函数插入pair
aMap.insert(pair<string, string>(“r000”, “student_zero”));2.用"array’方式插入
*/
aMap[0] = ‘o’;
aMap[1] = ‘a’;
aMap[2] = ‘b’;
aMap[3] = ‘c’;
aMap[4] = ‘d’;
aMap[5] = ‘d’;//故意弄个重复的valueint key =2;
char value=‘d’;//通过key找value
if(aMap.count(key)>0)
{
cout<<“通过key: “<<key<<” 找到的value:”<<aMap[key]<<endl;
}//通过value找 key
for(std::map<int,char>::iterator it = aMap.begin();it!=aMap.end();it++)
{
if(it->second==value)
cout<<“通过value: “<<value<<” 找到的key:”<first<<endl;
}` -
?有一组错误
-
#include<cctype>//字符处理库 isdigit()//数字字符 isalpha()//字母字符
1015
- ?为什么list::iterator it不行,但typedef之后list_s就行
- !值得效仿
typedef struct stu { char name[20]; int id; float score; }STUDENT;
- ?结构体内grade=cai+de为什么是0
没有对grade赋值,添加s.grade = s.cai + s.de;
这句
1016
- 数位用string处理
if (da == (a[i] - '0')) pa = pa * 10 + da;
a[i]-‘0’ 即可化为数字
`
1017
- 数字和字符之间的转换要细心!!!
- ?有一组错误
1018
- 使用sort()对map排序
#include<bits/stdc++.h> using namespace std; bool cmp(pair<int,int> a , pair<int,int> b) { return a.first>b.first;//增序为 a.first<b.first(若是想排序的第二个数字,把first改成second即可) } int main() { map<int,int> s; s[1]=4; s[2]=3; s[3]=6; s[4]=7; s[5]=1; vector< pair<int,int> > v(s.begin(),s.end()); //利用vector容器储存后再进行排序。 sort(v.begin(),v.end(),cmp);
- ?只有一组正确
1019
- 快速反应:数位->string;排序->sort
- string类insert()用法
s.insert(pos,num,'char');
等等 - 先做一次一定得用do-while吗?不一定,while(1)即可
#1020
Analysis
- 面对对象的思维:构造月饼结构体,包含库存、总价等成员变量;
- 习惯vector>数组;
- vector+struct就可以记录一组对象的多组数据 嘿嘿!
- ? 小数位问题:float/float
- 输出保留两位小数:
cout <<setiosflags(ios::fixed)<< setprecision(2) <<bonus;
或者printf("%.2f",result);
1022
- 进制转换有函数:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vG8B2UkF-1631279001766)(:/a3be0ec5b6994b6285f60899994760fc)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xiEHkKge-1631279001767)(:/4e4879a6226046e6b9043cde2b0c8d1b)]
?但是改成_itoa_sVS可以运行,PTA系统编译不过
- 别怕进制转换,很简单啊:
stack<int> num; while (C) { num.push(C % D); C /=D; } while (!num.empty()) { cout << num.top(); num.pop(); }
- 倒序输出学会用stack
- 别忘了特殊情况,0不能作被除数;
1023
- ?下标超范围while(v[0]–)最后跳出循环时v[0]=-1!
- s的容量应该>=90
- p的指向,++p/p++,有0无0不能共用一个循环
1024
- ?啥叫数字的存储长度不超过9999字节
- substr()和stoi()的用法
- 难点在于放大过程:‘.’有、无;补0问题找到分界线n.size()-2
- !一步步拆解问题,你可以做到的!!!
1025
- 我读不懂题目!!!😥
1026
- 我终于明白了加减50这类操作的原理!为了四舍五入:例如N/100时,N可先 +50,则除完后的小数位>=0.5进位,<=0.5就舍去?但是还是有两组错误!
1027
- 如何找到i<=N的最大i?
- Debug成功!出现下列问题:
1.for(;;j+=2)而非j+2;
2.使用while(k–)时务必考虑k<=0的情况,若k可以=0则改为while(k>0){k--;}
3.for(对j){n内部while(j–)会改变j的值,添加int m=j;while(m–)} - 有两组数据错误
1028
Analysis
- 思路1:把不合理的人排除,再sort
- 思路2:不断比较大小找出最大最小值
Gap
- !string类可以直接比较生日大小
1029
语法
- string的find函数
-#include<cctype>
处理字符- toupper()转大写
1030
算法
- 找最长长度
- 循环中用result记录最终答案和temp来存储比较交换的值
- 有点像双指针,双循环j直接从i+result开始找
问题
- vector大小
vector<int> nums(N);
- 运行超时
1031
方法
- 运用二维vector
vector<vector<char> > id(N,vector<char>(18));
1032
问题
- C++STL各容器的区别和作用和用法
- student怎么归类到不同学校?
- 怎么把数据输入map?
方法
- 从所求出发,求得分最高学校的编号及得分,属于求最大值问题
1033
问题
if ((s2[i] >= 'A' && s2[i] <= 'Z') || s1.find(',') != string::npos || s1.find('.') != string::npos || s1.find('+') != string::npos || s1.find('-') != string::npos) continue;
为什么每次都执行???- 部分正确?