备考PAT乙级对于PAT算法题的一些经验 c++

不要因为对手弱小而轻视对手,不要因为题目简单而忽略细节

目录

不要因为对手弱小而轻视对手,不要因为题目简单而忽略细节

一: 一些常用函数

辗转相除法求最大公因数背过

字符串转整形  只可以转换最长10位字符串

判断素数函数   注意1不是素数

判断是否是字母,数字,大写字母,小写字母,空格

求最大,小值函数

交换函数,判断大小函数

求string类型对应的数字是多少

判断字符是否在A~E,a~t,0~9之间?

string转char数组

求最小公倍数

map默认按key升序排列,改为降序

reverse 翻转函数

Map的find()  和用STL模版find()来找vector数组指定元素

int[]赋值到vector

双端队列deque基本操作

单端队列queue基本操作

合并vector数组

字符串整体转为小写或大写

数值转string函数

char数组转string

二: 巧妙思路及想法

1.能用哈希映射就用哈希映射降低时间复杂度   一种是Map  一种是数组 这两种最常用

2.scanf() 和 printf耗费的时间低于cin 和 cout 有较高时间复杂度要求的题请使用c语言输入输出函数

3.  尽量减少函数调用,最好都写在Main方法里,因为方法调用耗费时间高于直接写在main方法里  遍历循环及时 break 降低时间耗费

4.  复杂度能用O(n)就不用O(n^2) 也就是两个for循环能平行写 就不嵌套写

5.  遇到猛一看很复杂的题其实就是让你找规律 

6.  一定要读清题目逻辑, 题目给出的要求一定要满足,没说的可能会出现的要求一定要实现!注意题目的输入输出格式,结果并列的该怎么排序输出?结果是唯一的还是多个? 输入是否可以为空?

7.  整形范围

8. 浮点型范围

9. 找不出代码哪里有bug?怎么办

10. 如何用printf打印%   ?

11.  写算法题直接#include 别废了吧唧的用特定头文件

12. 输出末尾不要有空格

13. 负整数取非!后为0  ,  0取非为1   ,   正整数取非为0


一: 一些常用函数

辗转相除法求最大公因数背过

int gcd(int a, int b){	return b == 0 ? a : gcd(b, a % b);}

字符串转整形  只可以转换最长10位字符串

string s="1234";
int a=stoi(s);

判断素数函数   注意1不是素数

bool isprime(int a) {
	if (a < 2) return false;
	for (int i = 2; i * i <= n; ++i)
		if (a % i == 0) return false;
	return true;
}

判断是否是字母,数字,大写字母,小写字母,空格

char a='1'
isdigit(a);//true
char b='a';
isalpha(b)//true
char c='c';
isupper(c);//flase
char d='D';
isupper(d);//true
char e=' ';//空格呗
isspace(e);//true 

求最大,小值函数

int arr[5]={1,2,3,4,5};
cout<<*max_element(arr,arr+2);//包头 不包尾  3
cout<<*min_element(arr,arr+2);//包头 不包尾  1

//min_element返回的是元素的地址,想要下标直接min_element(arr,arr+2)-arr  减去首地址即可

交换函数,判断大小函数

int a=1,b=0; 
cout<<max(a,b);//a
cout<<min(a,b);//b
swap(a,b);
cout<<a<<" "<<b;//0 1

求string类型对应的数字是多少

string s="123";
cout<<s[0]-'0';//1
cout<<s[1]-'0';//2
cout<<s[2]-'0';//3

判断字符是否在A~E,a~t,0~9之间?

char a='1',b='a',c='t';
if(a>='0'&&a<='9') cout<<"true";else cout<<"false";//true 
if(b>='A'&&b<='E') cout<<"true";else cout<<"false";//false
if(c>='a'&&c<='t') cout<<"true";else cout<<"false";//true 

string转char数组

	char *c = new char[3];
	string s = "123";
	strcpy(c, s.c_str());
	cout << c;//123

求最小公倍数

最小公倍数=两数的乘积/最大公约(因)数。

下面这个例子是求两个数的最小公倍数和三个数的最下公倍数

int gcd1(int a,int b){return b==0?a:gcd1(b,a%b);}
int gcd2(int a,int b)//求两个数的最小公倍数
{
    int ab=gcd1(a,b);
    return a*b/ab;
}
int a=1,b=2,c=3;
int d=gcd2(a,b);//d为2
int e=gcd2(d,c);//e为6 

map默认按key升序排列,改为降序

map<int,int,greater<int>> m;//降序

reverse 翻转函数

char a[3]={'1','2','3'};
reverse(a,a+3);
cout<<a;//321  其他类型数组同理 

Map的find()  和用STL模版find()来找vector数组指定元素

	map<int,int> m;
	m[1]=1;m[2]=1;m[3]=1;
	if(m.find(1)!=m.end()) cout<<"找到了";else cout<<"没找到";//找到了

	vector<int> v;
	v.push_back(1);v.push_back(2);v.push_back(3);
	if (find(v.begin(), v.end(), 1) != v.end()) cout << "找到了";else cout << "没找到"; //找到了

int[]赋值到vector

	int a[2] = {1, 2};
	vector<int> b(a, a + 2);

双端队列deque基本操作

deque<int> d;
d.size();//大小
d.empty(); //判空
d.pop_front();//删除头元素
d.pop_back();//删除尾元素
d.push_front(1);//从头入元素
d.push_back(1);//从尾入元素
d.clear();//清除所有元素
d.erase(iterator a);//删除元素  参数为迭代器 
d.front();//返回头元素引用
d.back();//返回尾元素引用

单端队列queue基本操作

queue<int> q;
q.size();//返回大小 
q.empty();//判空 
q.push(1);//添加元素 
q.push(2);//添加元素 
q.pop();//删除头元素 
q.front();//返回头元素引用
q.back();//返回尾元素引用 

合并vector数组

vector<int> v1,v2;
v1.insert(v1.end(),v2.begin(),v3.bgein());

字符串整体转为小写或大写

tolower toupper可以遍历字符串转换单个字符为对应大小写符号

string a="abD";
transform(a.begin(),a.end(),a.begin(),::toupper);//转大写 
transform(a.begin(),a.end(),a.begin(),::tolower);//转小写 

数值转string函数

int a=123;
to_string(a);
double b=1.2222;
to_string(b);

char数组转string

char a[] = "Hello";
string b(a);

数学<cmath>库

  • fabs(double a) 浮点数取绝对值

  • abs(int a) 整形取绝对值

  • floor(xxx) 向上取整(朝0靠)

  • ceil(xxx) 向下取整(远离0)

  • pow(x,y) 求x的y次方

  • sqrt(x) 开根号

  • exp(x) e的x次方double型(e本身是浮点)

  • log(x) 对lnx 以e为底求x的对数

  • log2(x) 以2为底

  • log10(x) 以10为底

二: 巧妙思路及想法

1.能用哈希映射就用哈希映射降低时间复杂度   一种是Map  一种是数组 这两种最常用

map<int,int> m;
int arr[n];

2.scanf() 和 printf耗费的时间低于cin 和 cout 有较高时间复杂度要求的题请使用c语言输入输出函数

scanf("",&);
printf("");

3.  尽量减少函数调用,最好都写在Main方法里,因为方法调用耗费时间高于直接写在main方法里  遍历循环及时 break 降低时间耗费

4.  复杂度能用O(n)就不用O(n^2) 也就是两个for循环能平行写 就不嵌套写

5.  遇到猛一看很复杂的题其实就是让你找规律 

例如1003 我要通过!里P左边A的数量跟P T中间A的数量和T右边A的数量的关系     一定要多举例子多动笔画画多思考

6.  一定要读清题目逻辑, 题目给出的要求一定要满足,没说的可能会出现的要求一定要实现!注意题目的输入输出格式,结果并列的该怎么排序输出?结果是唯一的还是多个? 输入是否可以为空?

比如 题目输入了两个正整数m n  .... 但是没有给出m n之间的大小关系   那么m n可能相等也可能不等,正整数就是>=1的整数

再比如1044 火星数字  

  • 地球人的 0 被火星人称为 tret。
  • 地球人数字 1 到 12 的火星文分别为:jan, feb, mar, apr, may, jun, jly, aug, sep, oct, nov, dec。
  • 火星人将进位以后的 12 个高位数字分别称为:tam, hel, maa, huh, tou, kes, hei, elo, syy, lok, mer, jou
  • 每行给出一个 [0, 169) 区间内的数字

[0, 169) 区间内的数字也就是输入最多只有两位数 ,  但是没有告诉你各个位数是用进位后的的火星文还是0到12的进位前的火星文  例如可以输入:tam tam  jan jan 和 jan tam 只需要根据每位权乘实际数量即可    tam tam 表示为(13^1) * tam + (13^0) * tam 而tam是13进制进位后的火星文表示大小为13

(13^1) * 13+(13^0) * 13=169+13

7.  整形范围

int4-2147483648~+2147483647
long int4-2147483648~+2141483647
long long long int8-9223372036854775808~+9223372036854775807

一般只会用int 或者 long long 型  ,  int 10位数   long long 20位数

8. 浮点型范围

float

32

6~7

-3.4*10^38~+3.4*10^38

double

64

15~16

-1.7*10^-308~1.7*10^308

long double

128/

18~19

-1.2*10^-4932~1.2*10^4932

做算法题浮点型就得用double 别给我使float  .... double 300多位

9. 找不出代码哪里有bug?怎么办

对每个关键变量,都要输出一下,只有输出才能让你看到哪里有问题,  才能看到哪个环节哪个变量出现问题了, 每次写完代码不知道哪些细节可能错了,就把每个变量都打印出来,观察数值是否正确

10. 如何用printf打印%   ?

​
//第一种
printf("%%");  // 输出 %
//第二种
int a=10;
printf("%%%d",a);  //输出 %10

​

11.  写算法题直接#include<bits/stdc++.h> 别废了吧唧的用特定头文件

12. 输出末尾不要有空格

13. 负整数取非!后为0  ,  0取非为1   ,   正整数取非为0

14. 段错误    我做题90%都是因为数组越界访问  或者 对空容器进行访问

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值