PTA basic 刷题 总结

string 头文件

str1.find(s) 查找字串
#include<cctype>   //头文件
//判断相等
str1.find(s) != string::npos
//判断不等
str1.find(s) == string::npos

string::npos参数 —— npos 是一个常数,用来表示不存在的位置

str.erase()删除

(1)erase(pos,n); 删除从pos开始的n个字符,比如erase(0,1)就是删除第一个字符
str.erase(3,2);
(2)erase(position);删除position处的一个字符
it = str.begin()+3;
str.erase(it);
(3)erase(first,last);删除从first到last之间的字符
str.erase(str.begin+3,str.begin+5);

s.substr(size_type pos = 0, size_type count = npos)截取子串
a = c.substr(0,i);
b = c.substr(i+1,c.size()-i-1);
stoi()与to_string()

stoi(str,pos起始位置,r进制)将r进制s转成10进制的数字
PS:stoi()函数如果传入的字符串s中含有不是数字的字符,则只会识别到从开头到第一个非法字符之前,如果第一个字符就是非法字符则会报错

to_string(number)将数字转化为字符串

#include<iostream>
#include<string>
using namespace std;
int main() {
 string str = "1010";
 int a = stoi(str);//默认是10进制,将1010转化为10进制数值
  int b = stoi(str, 0,2);//将2进制的1010转换成10进制
 cout <<"(10进制的字符串1010转化为十进制数值):\n" <<a << endl;
 cout <<"(2进制的1010转换成10进制):\n" <<b << endl;
 return 0;
}
(10进制的字符串1200转化为十进制数值):
1010
(2进制的1010转换成10进制):
10

string字符串拼接

  • append()

append函数常用的三个功能:

直接添加另一个完整的字符串:如str1.append(str2);
添加另一个字符串的某一段子串:如str1.append(str2, pos, len);pos起始位置,len添加字符串长度
添加几个相同的字符:如str1.append(5, ‘a’);注意,个数在前;字符在后;在str1后面添加5个"a"

  • push_back()
    功能:将字符添加到字符串的末尾
    PS:只能是字符而不是字符串
s .push_back('a');
s .push_back("abc");//错误

  • +=

cctype包含的其他部分的函数


 1. isalnum() 如果参数是字母数字,即字母或数字,该函数返回true
 2. isalpha() 如果参数是字母,该函数返回真
 3. isblank() 如果参数是空格或水平制表符,该函数返回true 
 4. iscntrl() 如果参数是控制字符,该函数返回true
 5. isdigit() 如果参数是数字(0~9),该函数返回true
 6. isgraph() 如果参数是除空格之外的打印字符,该函数返回true
 7. islower() 如果参数是小写字母,该函数返回true
 8. isprint() 如果参数是打印字符(包括空格),该函数返回true
 9. ispunct() 如果参数是标点符号,该函数返回true 
 10. isspace() 如果参数是标准空白字符,如空格、进纸、换行符、回车、水平制表符或者垂直制表符,该函数返回true 
 11. isupper() 如果参数是大写字母,该函数返回true 
 12. isxdigit() 如果参数是十六进制的数字,即0~9、a~f、A~F,该函数返回true
 13. tolower() 如果参数是大写字符,则返回其小写,否则返回该参数
 14. toupper() 如果参数是小写字母,则返回其大写,否则返回该参数

vector 大法

求数组最值方法:

#include<vector>
vector<int> v(N);
//最大值
vector<int>:: iterator it = max_element(v.begin(),v.end())
//最小值
vector<int>:: iterator it = min_element(v.begin(),v.end())
cout<<*it<<endl;

不能用memset初始化vector

不该偷的懒,还是不要偷!!!
vector中有其自身的结构,不能单纯的按字节进行初始化。使用memset对vector进行初始化,会破坏vector中的结构,造成vector中的数据错误

reverse()

倒置字符串,用法为:

#include <algorithm>
vector<int> v(N);
//全部倒置
reverse(v.begin(),v.end());
//某一部分(i —— j)倒置
reverse(v.begin()+i,v.begin()+j);

set

常见方法:

begin()  最开始的一个元素
end()  最后一个元素
clear()  清空所有元素
empty()  判断是否为空
size()		set的元素个数
insert()	插入元素
iterator 迭代器

这里写一下iterator用来遍历set的用法:

set<int>  s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(4);

set<int>::iterator it;
for(it = s.begin() ; it != s.end() ; it++){
	cout<<*it<<endl;
}

map

头文件:#include< map >
创建:map<key, value> mapname;
添加元素:
个人喜欢用数组:
mapname[key] = value;
迭代器:
map<key, value>::iterator it;

it->first======key
it->second ===value

sprintf 和 sscanf函数

头文件:#include<stdio.h >
sprintf
按照特定格式输入字符串;
sprintf(charstring, charformat, var);
sscanf
字符串按照特定格式输入到变量
sscanf(charstring , charformat,var );

string s,t;
double temp;
sscanf(s,"%lf",&temp);
sprintf(t,"%.2f",temp);

取整:

头文件:#include< cmath >
向上取整:比自己大的最小整数
ceil(num);
向下取整:比自己小的最大整数
floor(num);
四舍五入取整:
round(num);

最大公约数与最小公倍数

来源:http://www.360doc.com/content/19/0412/20/35418877_828346885.shtml
在这里插入图片描述

//最大公约数:辗转相除法
//写法一:
int gcd(int a, int b){
	int y = b;
	while(a%b){
		y = a%b;
		a = b;
		b = y;
	}
	return b;
}
//写法二:
int gcd(int a, int b){
	return b == 0 ? a : gcd(b, a%b);
}
//最小公倍数

int mcm(int a, int b){
	return a*b/gcd(a,b);
}

一些有点意义的题:
1049 数列的片段和
1054 求平均值

刷题过程中一些常见的坑点QTQ

  • id为xxx位数字
    比如:id为 5 位数字(从 00000 到 99999)
    注意两点:1.输出用printf("%05d", id); 2. id 从00000 到 99999,所以赋初值时需要注意不能为0

  • 输入为a,b,但是两数字大小不确定,而结果与a,b大小有关
    需要判断a,b大小,保持一定的顺序
    1062 最简分数 (20分)

  • 链表类的题,遍历时尽量用v[i].next!=-1(如果以-1作为链表结束条件),做为结束条件。题目中可能存在单独的结点,用for (int i = 0; i < N; ++i)不准确。
    1075 链表元素分类 (25分)

  • 数学问题,找不到简便解法,暴力搜索,注意数据类型
    1088 三人行

乙级题终于被我刷得差不多了,happy ending!!! 回头想想其实coding也很有意思,继续我的刷题之路。

路漫漫其修远兮,吾将上下而求索

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值