个人机试总结

一、有关字符串问题

1.利用scanf函数(注意头文件#include<stdio.h>)

scanf("%[^c]",str); 其中c为具体字符常量(包括控制变量),当输入字符串时被当作当前输入的结束符,即用于指定字符串的结束标志。

举例:scanf("%[a-z A-Z 0-9]",str);表示只匹配输入是大小写字母和数字,遇到其他输入结束。

scanf("%[^\n]",st); \n作为输入结束符,即回车结束。

2.getline()   (头文件#include<string>)    用于string定义的变量

举例:string s;getline(cin,s);  读取整行字符串

3.cin.get(char *str,int maxnum)

举例:char str[10];  cin.get(str,10);

4、将string类型转成字符数组,string s;s.c_str();(string str;str = "2"; int num = stoi(str);)

string 转long long类型  atoll(s.c_str());    转int类型 atoi(s.c_str());   转double类型 atof(s.c_str()); 

to_string(int n):将 n 转换为 string    整型转字符串

5、大写字母的ASCII值为65到90,小写字母为97到122;

6、使用 string.find(str) 方法查找字符,可用于字符串匹配问题;其中括号里可以是字符或字符串;若找不到则返回string::npos;要想判断 find() 的结果是否为npos,最好的办法是直接比较:
if (str.find(“abc”) == string::npos) { … }    其中string::npos等价于s.npos(string s;)

s.find(str, i)  其中i为查找的起始点;

7、while(cin>>a){  ........    if(cin.get()=='\n') break;}   循环输入,回车退出。若不加最后一句则Ctrl+z退出

8、字符串string可以直接用<,>来比较字典序,也可以用compare函数

s1.compare(s2); 

s1.compar(pos1,len1,s2,pos2,len2);这个可以截取相应字符串比较大小,pos为起始位置,len为长度;

9、string的数字字符型转int型通过s[i]-'0';即可 

注意:若string字符串想加入数字时,需要在后面加+'0',要不然会添加失败。即s+=a+'0';

这个数字是int 变量的一个值,如int a = 3;想把a=3的3加入字符串时要在后面加'0'

二、有关其他算法输出问题

C语言中输出%,    printf("%%");    输出小数  printf("%.3f/.3lf",a);  保留三位小数

对齐输出是printf("%nd",a);其中n表示右对齐的宽度,左对齐不用n

C++中输出小数是头文件#include<iomanip>+cout << fixed << setprecision(n) << shu;其中n表示保留位数。另外对齐输出也是用同一头文件+cout<<right/left<<setw(n)<<shu;其中n表示对齐宽度。

浮点数的绝对值用  fabs(),     整数的绝对值为  abs()

scanf的输入要比cin的输入要快;

注意:若数据中存在带小数得乘除时,注意用double类型接收,否则会自动转成int型;

int a=2+1.0/2;   a=2 ×   实际需要的是2.5;

三、一些做算法题的总结

1、如果题目说的是实数,则一般用double型,其他类型可能某些数据运行不通过。

2、π一般取小数点后5位,3.14159;

3、ceil(x):向上取整;floor(x):向下取整;  头文件是#include<cmath>; round(x):四舍五入

4、int 型一般10的9次方,longlong型10的18次方

5、double类型取余用fmod(a,b);头文件为#include<cmath>;

6、vector的使用需要头文件#include<vector>,

vector<int>a;创建数组变量     a.push_back(b);添加元素        a.size();数组元素个数

7、sort函数   sort(a,a+n,cmp);其中a为数组名,n为总数量,cmp可不写,默认升序,若需要降序,则需要对cmp重写,如bool cmp(int a,int b){reuturn a>b;}  (即若a>b则不交换否则交换a,b)

sort()排序函数是c++头文件include <algorithm>中的函数

如果是vector则是v.begin(),v.end()

8、对于二维数组输出对线元素,注意左对角线元素各元素只差相等,右对角线元素各元素之和相等;

9、对于二维数组边界越界问题,可以放大数组范围,以便统一处理;(省得讨论边界情况)

数组越界的小技巧

10、对于A,B轮流的题,只需要设置一个变量,让A,B结束后指向对方。

11、对于数组的擂台法,初始值设pos=0,然后循环内部判断条件为(数组第一个位置不放值)

                 if(pos==0 || a[i]<a[pos])pos=i;

12、C++中表示正无穷是0x3f3f3f3f,负无穷是0xc0c0c0c0或0xcfcfcfcf

13、对于数字统计包含0~9之间个数的个数,可以使用while循环判断。引申:当对操作需要重复操作时,且操作次数不确定时,优先考虑用while循环

14、求最大公约数

//求最大公约数
int gcd(int x,int y)
{
    if(!y)
       return x;
    else
        return gcd(y,x%y);
}
//求最小公倍数:最大公约数和最小公倍数的乘积等于原来两个数相乘
int fun(int a,int b)
{
   return a*b/gcd(a,b);
}

15、
 

四、错误总结

算法运行正常但是数据不通过,则有以下错误:

1、数据类型大小(出现加法/乘法的时候,注意int型溢出,需要改成long long型,尤其是循环时变量相加,最高次等于循环次数乘以变量最大值;)

2、漏了条件判断(如奇偶性、以及特殊情况)逻辑没问题时,注意是否符合题目输出,仔细看题

一般是输出问题,如边界为0的值,输出的大小写

3、longlong类型的数据不能连乘,容易造成数据溢出,所以考虑其他做法让其不相乘;

其他连乘的情况注意溢出,所以尽可能减少溢出,即需要除时尽可能边乘边除

4、如8/10,不要写成0.8,容易造成数据丢失;

5、当操作相同但是具体赋值不同,则可考虑一一列举;

6、ceil()返回的double类型,所以使用时,若要求是int型需要强制转换即 (int)ceil(a);

7、计算小数点后第n位时,用循环a=a%b;a=a*10;

8、数字和字符串有时联系一起考虑更方便,比如求数字431533中数字3的个数,可以直接考虑用字符串;

10、使用 cout << endl; 输出换行会导致 TLE(超过时间限制);

请使用 cout << "\n"; 或者是 printf("\n"); 输出换行。

11、注意有时循环输入的时候就可以进行考虑相关操作,如加;

12、判断数字中是否包含某数字,如是否包含62,有两种做法:

一、将输入的数字用字符串输入,通过字符串来判断是否含有62;

二、先对100取模看余数是否是62,如果不是则除10,重复上述操作;

13、对于大于0小于2的64次方的正数要用unsigned long long 类型;

14、对于简单的x的n次方用pow函数容易造成超时,所以用循环乘法实现连乘;

15、0和任意值异或等于本身,自己与自己异或等于0;

16、>>右移运算,等价于除2,与&1进行判断二进制位是否为1(<<左移)

17、一些初始值注意是放在循环里面还是循环外面

18、字符串读取内容时,获取数字个数,注意范围是ASCII码比较,s[i]>='0' && s[i] <= '9',带引号

19、使用变量时,注意变量的使用范围,尤其是需要循环重复使用时,变量初始值需要每次置为零

20、特别注意题目要求,不要想当然,如输入两个值,但是注意有没有说这两个值大小关系,此外,也需要注意等于 0 的时候条件判断(循环n次时,有没有说n!=0)。

以上仅个人总结,有什么不对的地方还请dalao们指出,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值