首页 / 资讯中心 / 文章详情

西邮Linux兴趣小组2024纳新面试题题解

西邮Linux兴趣小组2024纳新面试题题解 ★ FEATURED ARTICLE
西邮Linux兴趣小组2024纳新面试题题解0. 聪明的吗喽一个小猴子边上有 100 根香蕉它要走过 50 米才能到家每次它最多搬 50 根香蕉多了就拿不动了它每走 1 米就要吃掉一根请问它最多能把多少根香蕉搬到家里。提示他可以把香蕉放下往返走但是必须保证它每走一米都能有香蕉吃。也可以走到 n 米时放下一些香蕉拿着 n 根香蕉走回去重新搬 50 根。解析直接一次搬 50 根的话到家就剩 0 根所以必须分批次进行搬运。先搬 50 根走到x米处放下50-2x根回去还要走 x 米吃 x 根返回起点。再搬剩下的 50 根走到 x 米处此时手里剩50-x根加上之前放下的总共100-3x根。令100-3x ≤ 50保证剩下的能一次搬走得x≥17取整数。x17 时剩下100-5149根剩余路程50-1733米走 33 米吃 33 根最后剩49-3316根。答案161. 西邮Linux欢迎你啊请解释以下代码的运行结果intmain(){unsignedinta2024;for(;a0;a--)printf(%d\n,printf(Hi guys! Join Linux - 2%d,printf()));return0;}解析一眼望去这题首先就有一个坑a是无符号整型终止条件是a0显然a是一直大于0的那么循环就不会终止。不仔细的话就会认为它循环2024次。这题考得巧考了printf的返回值其返回值为成功打印的字符个数包括空格符号等。新手一般都没注意到这个。那么第二个%d为0。第一个则为24。这点可补足知识盲区。c语言是按序执行的程序从左往右从上到下依次执行。每次循环就会都输出Hi guys! Join Linux - 20然后24跟在20后面。答案死循环每次循环都输出Hi guys! Join Linux - 2024并换行。2. 眼见不一定为实输出为什么和想象中不太一样你了解 sizeof() 和 strlen() 吗他们的区别是什么intmain(){charp0[]I love Linux;constchar*p1I love Linux\0Group;charp2[]I love Linux\0;printf(%d\n%d\n,strcmp(p0,p1),strcmp(p0,p2));printf(%d\n%d\n,sizeof(p0)sizeof(p1),strlen(p0)strlen(p1));return0;}解析sizeof的作用计算字节占内存的总大小包括\0。strlen的作用计算字符串的大小不包括\0并且碰到第一个\0后就停止计算。strcmp的作用:其本质是将两个字符串里的对应的字符的ASCII码值进行一 一比较在没有遇到不同的字符的情况下任意一个字符串只要遇到\0就停止比较并返回0。若遇到不同的字符则返回前一个字符串中的不同的字符的ASCII与后一个字符串中的不同的字符的ASCII的差值。是用来判断是否相等的相等返回1不等返回0。sizeof(p1)是算指针P1的大小。答案00013. 1.1 - 1.0 ! 0.1为什么会这样除了下面给出的一种方法还有什么方法可以避免这个问题intmain(){floata1.0,b1.1,ex0.1;printf(b - a ex is %s\n,(b-aex)?true:false);intAa*10,Bb*10,EXex*10;printf(B - A EX is %s\n,(B-AEX)?true:false);}解析该题考查浮点数的精度误差。用二进制存储小数是无法精确储存的只能存储一个无限接近该小数的值那么在计算时并不是用这个数本身的大小在计算而是用一个接近它的数。那么结果定不是我们认为的结果。这是个陷阱。答案falsetrue方法判断差值的绝对值是否小于一个可接受的极小误差阈值如1e-64. 听说爱用位运算的人技术都不太差解释函数的原理并分析使用位运算求平均值的优缺点。intaverage(intnums[],intstart,intend){if(startend)returnnums[start];intmid(startend)/2;intleftAvgaverage(nums,start,mid);intrightAvgaverage(nums,mid1,end);return(leftAvgrightAvg)((leftAvg^rightAvg)1);}解析average()利用递归和位运算求平均值。它将区间分成两个子区间然后算这些子区间的平均值。再把两个子区间的平均值再求一次平均作为当前整个区间的平均值返回。优缺点运算快但可读性差。5. 全局还是局部!!!先思考输出是什么再动动小手运行下代码看跟自己想得结果一样不一样 -inti1;staticintj15;intfunc(){inti10;if(i5)i;printf(i %d, j %d\n,i,j);returni%j;}intmain(){intafunc();printf(a %d\n,a);printf(i %d, j %d\n,i,j);return0;}解析static的作用作用于局部变量使该局部变量的生命周期变长可以从程序开始存在于程序结束。但该局部变量的作用域未变。作用于全局变量使该全局变量只能在本文件中起作用其他文件无法调用。作用于函数使其作用域限制在本文件中i为全局变量函数中对其值的更改只能在函数中用出了函数它的值又变为1。答案i 11; j 15;a 11;i 1; j 15;6. 指针的修罗场改还是不改这是个问题指出以下代码中存在的问题并帮粗心的学长改正问题。intmain(intargc,char**argv){inta1,b2;constint*pa;int*constqb;*p3,qa;constint*constra;*r4,rb;return0;}解析const的作用修饰变量后此变量不可更改。修饰指针: const在 * 左边指针指向的内容不能更改;const在 * 的右边指针不能改。const在 * 中间什么都不能改。修饰函数函数内部不会修改传入的数据。答案intmain(intargc,char**argv){inta1,b2;constint*pa;int*constqb;pb;*q6;constint*constra;return0;}7. 物极必反你了解 argc 和 argv 吗这个程序里的 argc 和 argv 是什么程序输出是什么解释一下为什么。intmain(intargc,char*argv[]){while(argc0);inta1,bargc,c0;if(--a||bc--)for(inti0;argv[i]!NULL;i)printf(argv[%d] %s\n,i,argv[i]);printf(a %d, b %d, c %d\n,a,b,c);return0;}解析argc 和 argv 是什么argc命令行参数个数程序本身算第 1 个参数至少为 1。argv命令行参数字符串数组argv[argc]为NULL。相当于数组内装的是参数的地址。有一个坑。while 循环后面是 ; 。意味着下面的代码并不在循环内一不留神可能会看错。并且呢循环的次数非常多只有argc溢出成为负数循环才能结束。逻辑运算符是有短路现象的。轻而易举的可以判断出if语句是不执行的。那么最终执行printf(a %d, b %d, c %d\n, a, b, c);。答案a 0, b 溢出后的值, c -18. 指针数组数组指针指针数组在主函数中定义如下变量intmain(){inta[2]{4,8};int(*b)[2]a;int*c[2]{a,a1};return0;}说说这些输出分别是什么a,a1,a,a1,*(a1),sizeof(a),sizeof(a)*b,*b1,b,b1,*(*b1),sizeof(*b),sizeof(b)c,c1,c,c1,**(c1),sizeof(c),sizeof(c)解析指针数组是什么指针数组是存放指针的数组数组的元素是指针。指针数组的形式存放的指针的指针类型类型数组名[数组元素个数], ” * “不与变量名放在同一括号里面int *c[2]是指针数组。数组指针是什么指向数组地址的指针。数组指针的形式(被指向数组所存储元素的数据类型)*指针变量的名字[被指向数组所存储元素的个数]。int(*b)[2]是数组指针。除了数组名和sizeof(数组名)数组名都是数组首元素的地址。答案表达式结果或含义a首元素地址a1第二个元素地址指向 a [1]a整个数组的地址a1跳过整个数组指向数组末尾之后*(a1)等价于a[1]值为 8sizeof(a)整个数组大小8 字节sizeof(a)指针大小4 字节*b解引用数组指针得到数组 a*b1等价于a1指向 a [1]b数组指针本身值为 ab1跳过一个 int [2]和 a1 相同*(*b1)等价于 a [1]值为 8sizeof(b)指针大小4 字节sizeof(*b)数组大小8 字节c指针数组首元素地址c1指向第二个元素 c [1]c整个指针数组的地址c1跳过整个指针数组*(c1)等价于 c [1]值为 a1sizeof©整个指针数组大小8 字节sizeof(c)指针大小4 字节9. 嘻嘻哈哈好玩好玩在宏的魔法下数字与文字交织猜猜结果是什么#defineSQUARE(x)x*x#defineMAX(a,b)(ab)?a:b;#definePRINT(x)printf(嘻嘻结果你猜对了吗包%d滴\n,x);#defineCONCAT(a,b)a##bintmain(){intCONCAT(x,1)5;intCONCAT(y,2)3;intmaxMAX(SQUARE(x11),SQUARE(y2))PRINT(max)return0;}解析宏是纯文本替换不会自动加括号、不会计算优先级。答案嘻嘻结果你猜对了吗包11滴10. 我写的排序最快写一个 your_sort 函数要求不能改动 main 函数里的代码对 arr1 和 arr2 两个数组进行升序排序并剔除相同元素最后将排序结果放入 result 结构体中。intmain(){intarr1[]{2,3,1,3,2,4,6,7,9,2,10};intarr2[]{2,1,4,3,9,6,8};intlen1sizeof(arr1)/sizeof(arr1[0]);intlen2sizeof(arr2)/sizeof(arr2[0]);result result;your_sort(arr1,len1,arr2,len2,result);for(inti0;iresult.len;i){printf(%d ,result.arr[i]);}free(result.arr);return0;}答案#includestdio.h#includestdlib.hstructresult{int*arr;intlen;};voidyour_sort(intarr1[],intlen1,intarr2[],intlen2,structresult*res){inttotallen1len2;int*big_arr(int*)malloc(total*sizeof(int));inti;for(i0;ilen1;i){big_arr[i]arr1[i];}for(i0;ilen2;i){big_arr[len1i]arr2[i];}intj,temp;for(i0;itotal-1;i){for(j0;jtotal-1-i;j){if(big_arr[j]big_arr[j1]){tempbig_arr[j];big_arr[j]big_arr[j1];big_arr[j1]temp;}}}intcount0;for(i0;itotal;i){if(i0||big_arr[i]!big_arr[i-1]){big_arr[count]big_arr[i];count;}}res-arrbig_arr;res-lencount;}intmain(){intarr1[]{2,3,1,3,2,4,6,7,9,2,10};intarr2[]{12,1,4,3,9,6,8};intlen1sizeof(arr1)/sizeof(arr1[0]);intlen2sizeof(arr2)/sizeof(arr2[0]);structresultres;your_sort(arr1,len1,arr2,len2,res);inti;for(i0;ires.len;i){printf(%d ,res.arr[i]);}free(res.arr);return0;}11. 猜猜我是谁在指针的迷宫中五个数字化身为神秘的符号等待被逐一揭示。intmain(){void*a[]{(void*)1,(void*)2,(void*)3,(void*)4,(void*)5};printf(%d\n,*((char*)a1));printf(%d\n,*(int*)(char*)a1);printf(%d\n,*((int*)a2));printf(%lld\n,*((longlong*)a3));printf(%d\n,*((short*)a4));return0;}解析指针类型决定了 1 的步长。指针数组里的数字被强制转化成了指针指针数字是访问内存的地址类型转换和 * 优先级高于 地址低 → 高a[0]: 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00a[1]: 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x00a[2]: 0x03 0x00 0x00 0x00 0x00 0x00 0x00 0x00a[3]: 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00a[4]: 0x05 0x00 0x00 0x00 0x00 0x00 0x00 0x00答案0224212. 结构体变小写奇遇记计算出 Node 结构体的大小并解释以下代码的运行结果。uniondata{inta;doubleb;shortc;};typedefstructnode{longlonga;uniondata b;void(*change)(structnode*n);charstring[0];}Node;voidfunc(Node*node){for(size_ti0;node-string[i]!\0;i)node-string[i]tolower(node-string[i]);}intmain(){constchar*sWELCOME TO XIYOULINUX_GROUP!;Node*P(Node*)malloc(sizeof(Node)(strlen(s)1)*sizeof(char));strcpy(P-string,s);P-changefunc;P-change(P);printf(%s\n,P-string);return0;}解析内存对齐原则结构体成员的起始地址必须是自身大小的整数倍。若起始地址不是自身大小的整数倍起始地址会自动补齐到自身的整数倍。结构体的总大小必须是最大成员的整数倍。2.tolower是C 语言标准库ctype.h中的字符转换函数作用是将大写英文字母转换为对应的小写字母。2.malloc是一种向内存申请空间的函数。答案welcome to xiyoulinux_group!Node的大小24
阅读完成 · 觉得有帮助?
咨询建站