c++个人废纸篓

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(将字符串转换成无符号长整型数)

异或^

  1. 异或就是不进位相加
  2. 满足交换律
  3. 偶数次^为0

0^a=a;
a^a=0;

  • 只存在一个数奇数次出现,其他均偶数次,直接用0^所有就能求出
  • 存在两个奇数次出现的数,其他均偶数次
    1. 先异或一遍,任选第i位是1的地方,
    2. 再把第i位都是1/0的数^一遍 得到其中一个数
    3. 再和①得到的另一个数
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;

二分

注意事项

  1. 找中点 (L+R)/2容易溢出,建议用mid=L+((R-L)>>1);
  2. 二分适用情况不仅为单调序列,只要条件和逻辑满足二分思维就可

对数器

思路:没有OJ时,可以再写一个暴力解法,之后用Random制作随机数据

master公式求时间复杂度

T(N) = a * T(N/b) + O(N^d)

对于子问题同等规模时,可以用 后面为除去前面之外的复杂度

  1. log(b,a) > d --> 复杂度为 O(N^ log(b,a))
  2. log(b,a) = d --> 复杂度为 O(N^d * logN)
  3. log(b,a) < d --> 复杂度为 O(N^d)

贪心算法在笔试的解题套路

1. 实现一个不依靠贪心策略的解法X,就是暴力枚举
2. 脑补一些贪心策略
3. 使用 解法X 和 对数器 ,去验证贪心策略的正确性
4. 一定不要纠结贪心策略的证明

贪心策略在实现时,经常使用的技巧

1. 根据建立一个比较器来排序
2. 根据建立一个比较器建立一个堆


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值