血泪教训与总结!
检查时先检查是否将=写为==!
函数有返回值时,退出函数用return NULL; void时可直接用return;
进制转换
p进制的x转为十进制y:
int y=0; product=1;
while(x!=0){
y += (x%10)*product; //获取x个位后乘以次方
x /= 10; //x去掉个位
product*=p;
}
十进制y转换为p进制
int d[40],num=0;
do{
d[num++] = y % p;
y/=p;
}while(y!=0); //之所以用do...while是因为避免y=0时d数组为空。d数组倒序输出
##字符串hash
//大写字母
int hashFunc(char S[], int len){
int id=0;
for(int i=0; i<len; i++){
id=id*26+(S[i]-'A);
}
return id;
}
//大写字母 52进制转十进制
int hashFunc(char S[], int len){
int id=0;
for(int i=0; i<len; i++){
if(S[i]>='A'&&S[i]<='Z'){
id=id*52+(S[i]-'A);
}else if(S[i]>='a'&&S[i]<='z'){
id=id*52+(S[i]-'a')+26;
}
}
return id;
}
全排列
#include<bits/stdc++.h>
using namespace std;
const int maxn=11;
int n,P[maxn],hashTable[maxn]={false};
void generateP(int index){
if(index == n+1){ //循环边界,到达位数输出
for(int i=1; i<=n; i++){
cout<<P[i];
}
cout<<endl;
return;
}
for(int x=1; x<=n; x++){ //每一次循环代表以x为第一个数字的排列
if(hashTable[x]==false){
P[index]=x;
hashTable[x]=true;
generateP(index+1);
hashTable[x]=false;
}
}
}
int main() {
n=3;
generateP(1);
return 0;
}
区间贪心
const int maxn=110;
struct Inteval{
int x,y;
}I[maxn];
bool cmp(Inteval a, Inteval b){
if(a.x != b.x) return a.x > b.x;
else return a.y > b.y;
}
二分查找
mid = (left + right) / 2; //可能会超出int范围
mid = left + (right - left) / 2; //这样处理避免溢出
快速幂
给定a,b,m,求 a b a^b ab % m
如果b是奇数,则 a b = a ∗ a b −