晴问算法题库解题记录

晴问算法题库解题记录

晴神的网站 牛!!
在此处记录一下本人解题的过程,一些注意点,知识点

一、入门类别

1.各个类型

  • 整型int:%d的范围是从 − 2 31   2 31 − 1 -2^{31}~2^{31}-1 231 2311(即从-2147483648到2147483647),简单估算可以认为是绝对值在 2 ∗ 1 0 9 2*10^9 2109以内。【大致10位数字】
  • 长整型long long:%lld的范围是从 − 2 63   2 63 − 1 -2^{63}~2^{63}-1 263 2631,简单估算可以认为是绝对值在 9 ∗ 1 0 1 8 9*10^18 91018以内。【大致18位数字】
  • 字符型char:%c
  1. scanf()函数:scanf可以通过指针的方式理解。这篇博文讲解的很详细,非常感谢
  2. printf()函数:可以控制输出位数。输出两位浮点数%.2f,输出浮点整数%.0f。
  3. 强制类型转换:如(double)a。
  4. 运算符
  • 整除/:这是保留整数部分。如果想要使用浮点出发,需要将其中一个数(或两个数)强制转变为浮点型才可以。
  1. 定义常量:用const。如const double PI=3.14
    有两种方法#define和const但define是宏替换,一般不在这里使用。常量变量名一般用全大写。
  2. 条件运算符:如a>b?a=2:b=1
  3. 换行符:\n。注意方向
  4. 字符串转换:to_string()。注意要引用< string >
  5. getchar函数:用来输入单个字符。如c=getchar()。有一些题目需要先输入一个整数,然后输入多行字符串,这时候如果用gets、getline之类用来输入字符串的函数,都会把换行给接收到,导致输入的结果有问题。这时候可以考虑用getchar来接收整数后的换行,使后续的整行字符串能顺利读入
  6. 数学函数
    以下都接收浮点型,返回的也是浮点型。
  • fabs(a):a的绝对值
  • floor(a):a的向下取整
  • ceil(a):a的向上取整
  • round(a):a的四舍五入(实际是四舍六入五成双)
  • pow(a, b):a的b次方,其中b也可以是浮点型
  • sqrt(a):a的算术平方根(即开根号)
  • log(a):a的以自然对数
    为底的对数
  1. 条件判断语句:
  • if语句
  • if-else
  • switch:配合case和default以及break和continue
  1. 循环语句
  • while
  • do……while
  • for
  1. 交换函数:可以直接引用algorithm的swap
  2. 全局数组:当我们试图在函数中开一个大数组时,很容易使程序报错退出,这是因为在函数(包括主函数)中定义变量时,变量会存放在“栈”区,栈区可以分配的内存较小,所以在开大数组的时候会因为申请不到内存而报错退出。而如果我们把数组开在函数外面,那么将会存放在“堆”区,堆区可以分配的内存较大,适合开大数组。
  3. memset函数:memset函数在string.h或cstring头文件下,可以将数组中每个元素以字节为单位赋值
    举例来说:
  • 由于1个int型变量占用4个字节,对每个字节都赋值0的时候,因0的二进制为全0(即00000000),因此这4个字节的二进制拼起来后每一位都是0(即00000000000000000000000000000000),对应的十进制为0,所以最终数组每个元素都是0;
  • 由于1个int型变量占用4个字节,对每个字节都赋值-1的时候,因-1的二进制为全1(即11111111),因此这4个字节的二进制拼起来后每一位都是1(即11111111111111111111111111111111),对应的十进制为-1,所以最终数组每个元素都是-1;
  • 【注意!】由于1个int型变量占用4个字节,对每个字节都赋值1的时候,因1的二进制为00000001,因此这4个字节的二进制拼起来后是00000001000000010000000100000001,对应的十进制为16843009,所以最终数组每个元素都是16843009;
  • 由于1个char型变量只占用1个字节,因此对char型数组进行memset操作时,最终数组每个元素的值就是赋的值本身。
    最常见的就是用memset函数给数组赋值0或者-1,想赋其他的值如果对二进制不熟的话建议不用memset,而用fill函数
    如:
#include
#include
using namespace std;
const int MAXV=10;
int a[MAXV];

int main(){
    int x;
    scanf("%d",&x);
    memset(a,x,sizeof(a));
    printf("%d",a[0]);
}
  1. 字符串输入输出

字符串数组定义:

const MAX_LEN = 100;
char str[MAX_LEN];

【总结】

  • C++:使用cin.getline(str, MAX_LEN)
  • 想玩花活的(非必要不建议):使用scanf(“%[^\n]”, str)或fgets(str, MAX_LEN, stdin)

第一种最好使用,也够用了~
cin.getline:仅C++可用,C语言不可用。需要添加 #include < iostream >头文件,并且在头文件后增加一行using namespace std;。然后我们可以像下面这样使用,其中第一个参数是字符数组,第二个参数是最大允许读入的字符个数,设置为字符数组的长度即可。

C++
cin.getline(str, MAX_LEN);

后两者可以看晴神的笔记~

同时cin.getline可以配合puts()输出。

  1. 字符串长度
    当我们有一个字符数组str后,只需要使用strlen函数即可获得该字符数组的长度,使用strlen函数前需要先引入string.h或cstring头文件。
    strlen函数的实现原理是,从头开始扫描字符数组,直到碰到结束符\0时结束扫描。由于这个遍历的过程,使得strlen函数的时间复杂度是O(len),其中len表示字符数组的长度。因此,当我们需要遍历字符串时,尽可能提前使用strlen函数计算好长度,而不要在for循环中写类似for (int i = 0; i < strlen(str); i++)的语句,因为这会导致每次循环都要重新执行strlen函数来计算一次长度,使整体时间复杂度上升一个级别。

  2. *string和char s和char s[ ]的区别
    string 和 char *s的区别看这篇博文比较详细,非常感谢~
    char *s和char s[ ]的区别看这篇博文,非常感谢~

  3. 字符串拼接:strcat

完成至35题,将继续更新

你可能感兴趣的:(笔记,算法,笔记)