不要因为对手弱小而轻视对手,不要因为题目简单而忽略细节
目录
Map的find() 和用STL模版find()来找vector数组指定元素
1.能用哈希映射就用哈希映射降低时间复杂度 一种是Map 一种是数组 这两种最常用
2.scanf() 和 printf耗费的时间低于cin 和 cout 有较高时间复杂度要求的题请使用c语言输入输出函数
3. 尽量减少函数调用,最好都写在Main方法里,因为方法调用耗费时间高于直接写在main方法里 遍历循环及时 break 降低时间耗费
4. 复杂度能用O(n)就不用O(n^2) 也就是两个for循环能平行写 就不嵌套写
6. 一定要读清题目逻辑, 题目给出的要求一定要满足,没说的可能会出现的要求一定要实现!注意题目的输入输出格式,结果并列的该怎么排序输出?结果是唯一的还是多个? 输入是否可以为空?
11. 写算法题直接#include 别废了吧唧的用特定头文件
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. 整形范围
int | 4 | -2147483648~+2147483647 |
long int | 4 | -2147483648~+2141483647 |
long long long int | 8 | -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