目录
一、科软机试注意事项
- 在待完成的注释处写代码完成函数,main函数中的printf用于测试
- 函数中不要加注释,否则会随机报错,你找半天都找不出哪里出错
- 好好检查for循环和递归,死循环死递归直接卡2分钟把你心态搞崩
- oi赛制,按照测试用例给分,一道题5个测试用例,一个用例5分,考试时不会告诉你提交的代码通过几个用例,只能自己调试
- 只要时间复杂度不是太过分(指数级别),则一般能拿全分
- 能不能加头文件,不好说,有人说能有人说不能,个人觉得只要在线编译能通过就能用
二、leetcode注意事项
1. returnSize和returnColumnSize
- 如果返回值是一个一维数组的话,必定出现returnSize,它是一个int类型的指针,其指向的地址单元保存了数组中元素个数,
*returnSize = 2
表示返回值数组中元素的个数为2 - 如果返回值是一个二维数组的话,就必定同时出现returnSize和returnColumnSizes,returnSize是一个一级指针,其指向的地址保存的内容是二维数组的行数,returnColumnSizes是一个一维指针数组,保存返回值中各行的一维数组中元素个数
- returnColumnSize不能用memset赋值,而且用for循环赋值时(*returnColumnSizes)必须加括号
*returnSize = 3; //二维数组行数为3
*returnColumnSizes = (int*)malloc(3*sizeof(int)); //需要3个单元来记录各行元素个数
(*returnColumnSizes)[0] = 2; //二维数组第0行有2个元素
(*returnColumnSizes)[1] = 3; //第1行有3个元素
(*returnColumnSizes)[2] = 4; //第2行有4个元素
2. 其他注意事项
- 一定要注意输入元素为NULL等情况,我经常在这里犯错
- 链表最后一个节点的next指针置为NULL,否则会报错
- 在循环中定义数组(静态),编译器不会重复创建这个数组,因此不用担心内存爆炸的问题
- leetcode中返回的数组必须使用动态分配内存的数组,也就是必须要malloc
- 在开始编码前要考虑到各种极端情况(如爆int),所以我默认都定义long long类型就不容易出错哈哈哈,或者习惯上把减法放在加法前面
- 整数最大值为INT_MAX = 0x7FFFFFFF,最小值为INT_MIN = 0x80000000,学过计算机组成原理应该容易理解
- 字符串一定要记得有’\0‘,反斜杠0
- 全局变量必须在main函数中初始化,不要在外面初始化
- 数组的拷贝:int* arr1 和arr2,拷贝arr2到arr1不是直接给arr1赋值(浅拷贝),而是将arr2的元素挨个赋值给arr1,或者用memcpy(arr1,arr2,sizeof(arr2)/sizeof(int))的方式
- printf(“%d”,fmin(INT_MIN, INT_MAX));打印结果为0,因为fmim返回double类型
三、C语言小技巧
1. 数组初始化
将数组元素都置0
#include<string.h>
/*
注意别踩坑:
1.sizeof里面的数组只能是静态数组!!!
2.如果是用malloc分配内存的数组,malloc参数怎么写这里第三个参数就怎么写
3.稍不注意,直接buffer overflow
*/
int buf[255];
memset(buf, 0, sizeof(buf));//静态数组初始化
int* buf2 = (int*)malloc(255*sizeof(int));
memset(buf2,0,255*sizeof(int));//动态数组初始化
坑2: memset是按照一个字节一个字节赋值的,赋值char类型的数据永远不会出错,但是如果赋值超过1个字节的数据则有可能出现读取错误,因此初始化非char类型数组时,只能赋值为0或-1
2. 功能强大的sprintf函数和sscanf函数
#include<stdio.h>
char str[200];
//sprintf和printf效果一样,只不过一个输出到控制台,一个输出到数组中
//结合两函数可以轻松实现进制转换与字符串与数字之间转换
//注意C语言没有二进制的格式化方法,转为2进制需要自己写了
sprintf(str,"%d",12345); //12345转为10进制字符串
sprintf(str,"%x",1234); //转16进制
sprintf(str,"%o",1234); //转8进制
sprintf(str