19 5/26-5/29

1.对于 纯粹大写 或 纯粹小写的 字符串str
怎样用数字表示出它们的顺序呢?
比如:ABC=012,CBD=213;
这里只需要: str[i]-‘A’; 就可以了;

这样做的目的是 可以让字符串中的字符与数组中的数据一一对应;这在某些题目中可能会用得到;

2.列等价关系式时
等号两边的量一定是 同阶级 或 同等形式 的!
这应该是小学生都懂的东西,但我还是要再提一下,因为单单这一点就很容易制约思路;
一个做题时遇到的例子:

Peter 有n根烟,他每吸完一根烟就把烟蒂保存起来,k(k>1)个烟蒂可以换一个新的烟,那么 Peter 最终能吸到多少根烟呢?

这道题单纯来分析的时候,我是这样列 等式的: 吸k根烟=一根烟+一个烟蒂
但实际上这样写更容易打开思路:k根烟=一根烟+一个烟蒂
对,两个等式的差距,就是少了一个 吸字,但就是这一个 吸字 制约了我的思路,所以等号两边还是应该保持格式一致的好,多了一个 吸字,我就总是把它理解为一个动作,而不能打开思路;
(当然这应该是我个人的思考方面的问题,我感觉大多数人不会有这种问题,,,,)

3.关于 cmp
如果是对 vector 容器进行快排,利用cmp函数,有两个易错的地方:

bool cmp(vector<int> a,vector<int> b){   //这是错误写法
    return a>b;
}
bool cmp(int a,int b){       //这是正确写法,实际上vector<>括号里面是什么类型cmp就用什么类型就好
    return a>b;
}


vector<int> vi;
sort(vi,vi+n,cmp);         //这是错误的写法
sort(vi.begin(),vi.end(),cmp);    //这是正确的写法

4.什么时候可以考虑使用排序?
我就我近一个星期做过的题目做一个总结:
(1)题目提示信息非常明显的,如 请将结果倒序输出,升序输出等;
(2)问题字眼 涉及到 最少需要多少 或者 最多需要多少
(3)问题字眼 涉及到 最大 或者 最小

5.a/b*b
对于 int 型数据a, a/b*b 的结果是让每一个 幂增区间内的数 都 转化为这个区间的最小值
比如: a/2*2
对于 [21,22) 的所有数的运算结果 都是 2^1 ;
对于 [22,23) 的所有数的运算结果 都是 2^2 ;
对于 [23,24) 的所有数的运算结果 都是 2^3 ;
等等;
这个式子在 判断值输出 或者 取整相关运算 时可以 简化代码量

6.单引号与双引号的区别
单引号或者是双引号以前一直没怎么关注,最近一道题让我觉得有必要重新了解一下它们;
先说结论:
(1) 单引号 里面的数据表示是一个 字符,用 %c 输出是字符,用 %d 输出就是 ASCII码,用 cout 输出 默认输出字符;
(2)双引号 里面的数据表示是一个 字符串,用char a[ ] 定义这个类型 它就是字符串,用 char *p 定义 那p就是指向字符串首地址的指针;
(3)如果 单引号里面 括多个字符,即 ‘abcd’ 这种,那么编译器 默认只取其中最后一个字符,即 ‘d’;
(4)如果 双引号里面 括单个字符,即 "a"这种,它仍是一个字符串;
(5)字符的加减 是通过 直接加减 整数实现的,如想要让 a +1 变成 b,就直接 令 a+1即可,令 a+“1” 或者 a+‘1’ 都无法得到正确结果;

7.关于头文件 尖括号 与 双引号 的区别
(1)系统自带的头文件 用 尖括号括起来,用户自定义的头文件 用双引号 括起来;
(2)C++标准规定,包含C++提供的标准头文件或系统头文件时应使用尖括号,包含自定义头文件时可使用双引号;
(3)双引号括起来的文件,编译器会首先在用户自定义目录下查找,之后在C++安装目录下查找,最后才在系统文件目录下查找,尖括号括起来的文件,编译器会在系统文件目录下查找;

(4)#include 是 预处理指令;

8.strchr函数 与 strrchr函数
strchr函数
函数原型:strchr(const char *str,char c) const char *str 其实代表就是 字符串
作用:查找字符串str中 首次 出现c字符的位置;
返回值:查找成功时返回从字符串中的这个位置起,一直到字符串结束的所有字符,否则返回NULL;

strrchr函数
函数原型:strchr(const char *str,char c)
作用:查找字符串str中 末次 出现c字符的位置;
返回值:查找成功时返回从字符串中的这个位置起,一直到字符串结束的所有字符,否则返回NULL;

举例:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    	char str[]="waitter";
    	char c='t';
    	char *a=strchr(str,c);//注意这里只能是 char * 类型,因为函数返回值就是这个类型
    	cout<<a;
    	return 0;
}
运行结果:
tter

//如果函数改为strrchr
运行结果:
ter
//注意区别

另外记一个点,if( ) 条件判断语句里面 不仅仅填入数字不影响判断,填入字符,字符串,浮点数据,有返回值且返回值为真的函数等都不会影响判断,if( ) 都会把这些数据看作为真 对待,只有 这三种数据 if( ) 会判断为假,即 0 ,NULL, FALSE

9.getline 函数
getline函数是从 输入流 中读入字符,存到string变量中;
函数原型:getline(输入流,string变量,控制字符)
(解释):输入流即cin,string变量是用户自己定义的,控制字符可以省略,默认为换行符\n,是用来告诉getline函数什么时候停止读入的;
**返回值:**如果getline没有读入字符,将返回false,这可用于判断文件是否结束;

一个误区:
死循环读入

while(getline(cin,line)){
    cout>>line;
}

**【分析】**该while循环无法退出;一部分人可能会误认为 换行符 退出了while循环,实际上 换行符只是退出了 当前循环的getline函数,而while循环的判断条件是看 cin流是否为空,而事实上 cin流一直不为空,故while循环始终无法退出,而每一个新的while循环又会执行一次getline函数;

ps:未来两三天刷题量要适当降下来了,为了应付 web考试,我要上演一出 两天精通 web 的好戏了;(滑稽)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值