机试心得(一)常用技巧

记录自己在刷机试题时遇到的一些point,所用语言为c/c++,编译环境为Linux和g++。

 

1.while(scanf("%d",&n)!=EOF){} 用于输入多组数据,n表示这组数据将要输入的数据个数 若要输入字符串,则用while(gets(str))。

 

2.冒泡排序能写出代码,它的时间复杂度是o(n^2),如果需要时间复杂度更低的排序算法,可以使用c++内置的函数sort(起始地址,终止地址,cmp排序规则(可选,自定义))

 

3.sort函数定义排序规则,通过定义一个返回值为bool类型的函数来实现,返回值得为true,如果要实现降序,则bool cmp(int x,in y) return x>y

 

4.sort函数不但可以对基本类型进行排序,它还可以对自定义的类型进行排序,甚至可以对各种数据组合进行排序,只要你给自定义的结构体也定义好排序规则就可以了

 

5.c语言要用到字符串时一般不用string name1;(这是Java定义字符串的写法),c语言用char name1[100]; (字符数组)。但是因为字符数组也可以做一些运算,如比较函数:strcmp(name1,name2),前提是记得include模板

 

6.在sort函数中使用自定义的排序规则函数会出现问题(至少我的编译器会报错),而通过在结构体中重载小于运算符的方法就可以成功实现排序,更推荐重载运算符这种方法。

 

7.c/c++中由于一个问题常常会引起一系列error,而我通常是算法没有问题,倒是大小写经常出错,或者是复制过来的代码忘记检查修改(可能少了几个字符、重定义了变量、调用方法使用的参数不符合要求)

 

8.const定义常量/修饰参数,具体作用不是太清楚,先留个坑

 

9.数据的输入的一个处理技巧:scanf(“%4d%2d%2d”,&a,&b,&c); 输入一个8位数的数字,可以把前4位赋值给变量a,中间2位给b,后2位给c,在处理时间的时候(如20180606)尤其方便。

 

10.若要开辟一块内存比较大的空间,例如buf[5001][13][2],不要在任何函数在定义这样的数组(在main()函数中也不可以),因为函数所可以使用的栈空间不足以提供如此庞大的内存,会导致栈溢出。所以必须得在函数外定义,即定义为全局变量,或者在函数中使用malloc()等函数动态申请动态空间。

 

11.Hash真的是一种很好的思想,就是把数组的下标和它对应的实际意义联系起来,例如在处理学生成绩的时候,通常输入数据的可能情况是有限的,即0~100这101个整数,那么我们就可以开辟一个大小为101的整型数组int hash[101]={0};,然后每输入一个分数,如80分,那么hash[80]++;如此把输入的数据存储起来,后续非常好进行各种各样的操作。如果不是完全吻合的话,也可以宏定义一个偏移值,灵活使用offset使得数组下标与数据对应起来。反正理解哈希的思想是最重要的!!

 

12.linux这个傻子,由于内存的问题它就会段错误吐核,也不会给我报任何详细的原因,只知道编译没有问题,而在运行的时候才会出现内核的问题,我这次出现这个问题是因为写成了scanf(“%d”,n);又忘记了是写&n!!!多少次栽在这上面了!!

 

13.当要处理多组数据的时候,不要忘了处理每组数据之间要进行初始化,清楚上一组数据对下一组数据的影响。因此,变量初始化语句的位置非常重要。

 

14.我又出现吐核错误了,这次是因为,我在for循环中是想让i从大到小进行处理,而变量的处理没有设置为递减,同时还在循环里使用了数组,因此出现了数组越界的内存错误。

 

15.排版题是一类非常有意思的题,寻找各种数学规律,非常有趣。我学到了两种方法,第一种是通过分析输出的规律,利用循环的嵌套打印特定的字符串。另一种方法则是开辟足够大的二维数组,把输出屏幕想象成一个平面空间,把二维数组相应位置的值处理好之后,再把二维数组打印出来,即先排版再输出。

 

16.最简单的查找就是线性查找了,根据顺序一路找下去,查找就是在查找空间中用特定的查找方法寻找查找目标。

 

17.段错误段错误!我又忘记scanf输入时候变量要加&取地址符了!!细心一点吧!!‘

 

18.二分查找很容易,就是对base top进行处理,目标与mid进行比较,我这个算法写的非常顺利。开心啊哈哈哈哈。

 

19.结构体经常被用到,而且在结构体中重载小于运算符的频率也很高,在结构体中利用bool,operator,const等关键字对小于运算符进行重定义,这样的话在结构体外就可以方便的用sort函数对复杂类型进行排序了,嗯要掌握这种方法。

 

20.真的真的真的要熟练运用结构体啊,这样处理输入数据要比多维数组方便很多,而且因为是对现实世界物理对象的映射,所以理解起来也更方便。

 

21.关于double值 输入要用%lf,不能用%f(这是float用的),scanf的时候不能混用啊。而printf的时候,double和float都可以用%f,除此之外double还可以用%lf。为了不要记混,我建议double和float分开用。还有就是要细心一点,该定义为double类型的变量就不要错误地定义成int类型的了,这样在做除法的时候肯定会出错。当然具体哪些变量的类型要设置为double还是要根据题目要求来。

 

22.贪心算法的策略确实需要好好考虑,背包问题的贪心策略比较容易,就是每次都拿性价比最高的物品。时间表安排问题的经验是:选择结束时间最早的。具体方法是将每个项目按结束时间由早到晚排列,逐个比较当前时间与项目的开始时间,符合条件的项目就可以选择。

 

23.遇到编译时的错误:XXX在此作用域中尚未声明:常常是因为include语句没有写正确或者是忘了写using namespace std;

 

24.赋值的地方用了==????这样的低级错误也开始犯了吗。写个30行的代码10min左右,调试通过10min左右,效率还算是高,而且这道题还挺有趣滴。

 

 

你可能感兴趣的:(机试题)