文章目录
c++指针
变量 用“.” 访问
指针 用“->”访问
空指针,野指针
空指针:int *a = NULL;
是指向NULL(0)无法访问的指针
野指针:int *a = (int *)0x3333;
指向非法内存空间,未知的
指针常量 常量指针
指针常量:
const int *a = &p;
指针指向可以改变,指针指向的值不可以改变
常量指针:
int * const p = &a;
指针的指向不可以改变,指针指向的值可以改变。
指针与函数
1.值传递
实参不随形参改变而改变(不同内存地址)
2.地址传递
实参随着形参改变而改变(相同内存地址)
C++字符串处理函数总结
1. 基础函数
输入输出:cin,cout,getchar,gets,putchar,puts,printf,scanf
格式化:sprintf,sprintf_s,wsprintf,wsprintf_s,swprintf,swprintf_s (请仔细比较这几组函数的区别)
格式化值:
%% -返回百分号
%b –返回二进制数
%c –返回与ASCII值相对应的字符
%d –带有正负号的十进制数
%e –科学计数符号(如:1.2e+2)
%u –不带正负号的十进制数.
%ul 不带符号的长整型
%f – 浮点数据(本地设置)
%F –浮点数据(非本地设置)
%o –八进制数 %s –字符串
%x –十六进制数(小写字母) 例如:sprintf(s, "%#010x", 128); //产生"0x00000080"
%X –十六进制数(大写字母) char*字符串处理:strlen,strcpy,strcat,strcmp
2. 进阶函数
char*字符串处理:
char * strchar(const char * s, int c) ;返回指向字符串s中字符c首次出现的指针,没有返回NULL
char * strrchar(const char * s, int c) ;返回指向字符串s中字符c最后一次出现的指针,没有返回NULL
char * strstr(const char * s1, const char * s2) ;返回指向字符串s1中首次出现s2位置的指针,无返回NULL size_t strspn(const char * s1, const char * s2) ;返回s1中只包含s2中字符的起始段的长度
size_t strcspn(const char * s1, const char * s2) ;返回s1中不包含s2中字符的起始段的长度
char * strpbrk(const char * s1, const char * s2) ;返回指向s1中首次出现s2中字符位置的指针,没有返回NULL
char * strtok(char * s1, const char * s2) 将s1用s2中包含的字符分开记号拆散为字符串。(注意:strtok会修改输入的字符串,故请拷贝后再调用。)
char *strsep(char **stringp, const char *delim) 同上,分隔字符串,用法类似
3. string字符串处理:
长度:str.length()
尺寸:str.size()
比较:str1.compare(str2)
连接:str1+=str2
连接:str1.append(str2)
提取:str2=str2.substr(pos1)
查找:pos=str1.find(str2)
插入:str1.insert(pos1,str2);
替换:str1.replace(pos1,str2);
删除:str1.erase(pos,len)
清除:str.clear()
4. 字符串转数字:
atoi(将字符串转换成整型数)
atof(将字符串转换成浮点型数)
atol(将字符串转换成长整型数)
strtod(将字符串转换成双精度浮点数)
strtol(将字符串转换成长整型数)
strtoul(将字符串转换成无符号长整型数)
异或^
- 异或就是不进位相加
- 满足交换律
- 偶数次^为0
0^a=a;
a^a=0;
- 只存在一个数奇数次出现,其他均偶数次,直接用0^所有就能求出
- 存在两个奇数次出现的数,其他均偶数次
- 先异或一遍,任选第i位是1的地方,
- 再把第i位都是1/0的数^一遍 得到其中一个数
- 再和①得到的另一个数
void check(int n,int arr[]){
int rec=0;
for(int i=1;i<=n;i++){
rec^=arr[i];
}
int right = rec&(~rec+1); //取最右边一个为1的二进制
int reo = 0; //其中一个数字
for(int i=1;i<=n;i++){
if((right&arr[i])!=0){
reo^=arr[i];
}
}
printf("number 1:%d\nnumber 2:%d\n",reo,reo^rec);
}
a,b交换技巧
a=a^b;
b=a^b;
a=a^b;
二分
注意事项
- 找中点
(L+R)/2
容易溢出,建议用mid=L+((R-L)>>1);
- 二分适用情况不仅为单调序列,只要条件和逻辑满足二分思维就可
对数器
思路:没有OJ时,可以再写一个暴力解法,之后用Random制作随机数据
master公式求时间复杂度
T(N) = a * T(N/b) + O(N^d)
对于子问题同等规模时,可以用 后面为除去前面之外的复杂度
- log(b,a) > d --> 复杂度为 O(N^ log(b,a))
- log(b,a) = d --> 复杂度为 O(N^d * logN)
- log(b,a) < d --> 复杂度为 O(N^d)
贪心算法在笔试的解题套路
1. 实现一个不依靠贪心策略的解法X,就是暴力枚举
2. 脑补一些贪心策略
3. 使用 解法X 和 对数器 ,去验证贪心策略的正确性
4. 一定不要纠结贪心策略的证明
贪心策略在实现时,经常使用的技巧
1. 根据建立一个比较器来排序
2. 根据建立一个比较器建立一个堆