linux c/c++ 面试题目整理(一)

论坛 期权论坛 期权     
晟夏的叶   2019-6-30 18:59   3800   0
[h1]1、求下面函数的返回值[/h1]
    1. int func(x)
    复制代码
    1. {
    复制代码
    1.     int countx = 0;
    复制代码
    1.     while(x)
    复制代码
    1.     {
    复制代码
    1.         countx++;
    复制代码
    1.         x = x&(x-1);
    复制代码
    1.     }
    复制代码
    1.     return countx;
    复制代码
    1. }
    复制代码
问:假定x是9999,那么返回多少?
答:返回的是8,解题思路是将x转化为二进制,看含有多少个1,则就返回多少。
[h1]2、文件中有一组整数,要求排序后输出到另一个文件中[/h1]       如果数不多的情况下,可以直接将文件中所有整数读到set中,set类型会自动排好序,读完后再将所有整数写到另一个文件中去。
       而整数特别多内存又不够的情况下,可以分批读,每次读一部分排好序写到一个小文件中去,直到所有整数都读取完成,这时每个小文件就都是排好序的了,然后将所有小文件中第一个数读出来进行比较,选出最小的放到目标文件中去,然后将该最小的数所在文件的下一个数读取出来进行比较,这样所有小文件都比完之后,目标文件中就是排好序的所有整数了。
       思路:这里采用的是大而化小,化整为零的手段。
[h1]3、使用递归将两个有序链表合并为一个有序链表[/h1]       思路:理解递归,并定义好结束的条件
    1. Node * Merge(Node *head1, Node* head2)
    复制代码
    1. {
    复制代码
    1.     if (head1 == NULL)
    复制代码
    1.         return head2;
    复制代码
    1.     if (head2 == NULL)
    复制代码
    1.         return head1;
    复制代码
    1.     Node* head = NULL;
    复制代码
    1.     if (head1->data data)
    复制代码
    1.     {
    复制代码
    1.         head = head1;
    复制代码
    1.         head->next = Merge(head1->next, head2);
    复制代码
    1.     }
    复制代码
    1.         else
    复制代码
    1.     {
    复制代码
    1.         head = head2;
    复制代码
    1.         head->next = Merge(head1, head2->next);
    复制代码
    1.     }
    复制代码
    1.     return head;
    复制代码
    1. }
    复制代码
[h1]4、写一个函数找出整数数组中第二大的数[/h1]
    1. const int minnumber = -32767;
    复制代码
    1. int find_sec_max(int data[], int count)
    复制代码
    1. {
    复制代码
    1.     int maxnumber = data[0];
    复制代码
    1.     int sec_max = minnumber;
    复制代码
    1.     for( int i=1;I  maxnumber)
    复制代码
    1.         {
    复制代码
    1.             sec_max = maxnumber;
    复制代码
    1.             maxnumber = data[i];
    复制代码
    1.         }
    复制代码
    1.         else
    复制代码
    1.         {
    复制代码
    1.             if (data[i] > sec_max)
    复制代码
    1.                 sec_max = data[i];
    复制代码
    1.         }
    复制代码
    1.     }
    复制代码
    1.     return sec_max;
    复制代码
    1. }
    复制代码
思路:定义两个变量一直保存最大的两个整数
[h1]5、如何判断一个单链表是否有环[/h1]
    1. struct node
    复制代码
    1. {
    复制代码
    1.     char val;
    复制代码
    1.     node* next;
    复制代码
    1. }
    复制代码
    1. bool check(const node* head)
    复制代码
    1. {
    复制代码
    1.     if (head == NULL)
    复制代码
    1.         return false;
    复制代码
    1.     node* low = head,*fast = head->next;
    复制代码
    1.     while(fast != NULL && fast->next != NULL)
    复制代码
    1.     {
    复制代码
    1.         low = low->next;
    复制代码
    1.         fast = fast->next->next;
    复制代码
    1.         if (low == fast)
    复制代码
    1.         {
    复制代码
    1.             return true;
    复制代码
    1.         }
    复制代码
    1.     }
    复制代码
    1.     return false;
    复制代码
    1. }
    复制代码
思路:第一个节点每次走一步,第二个节点每次走两步,即第一个节点走n步的时候,第二个节点走了2n步,如果是有环的链表,n和2n处必定是同一个节点。
[h1]6、一个标准的strcpy函数[/h1]
    1. //strcpy的实现:
    复制代码
    1. char * strcpy(char* strDest, const char* strSrc)
    复制代码
    1. {
    复制代码
    1.     assert( (strDest != NULL) && (strSrc != NULL));
    复制代码
    1.     char *address = strDest;
    复制代码
    1.     while( (*strDest++ = *strSrc++) != ‘\0’);
    复制代码
    1.     return address;
    复制代码
    1. }
    复制代码
返回char*的原因:返回strDest的原始值使得函数能够支持链式表达式,增加了函数的附加值。同样功能的函数,如果能合理地提高函数的可用性,自然就更加的理想。
[h1]7、嵌入式系统可能用到这样的场景,即要求设置一绝对地址为0x67a9的整型变量的值为0xaa66,怎么设置?[/h1]
    1. int *ptr;
    复制代码
    1. ptr = (int*)0x67a9;
    复制代码
    1. *ptr = 0xaa66;
    复制代码
[h1]8、下面的代码输出是什么?为什么?[/h1]
    1. void foo(void)
    复制代码
    1. {
    复制代码
    1.     unsigned int a = 6;
    复制代码
    1.     int b = -20;
    复制代码
    1.     (a+b) > 6?puts(“>6”):puts(“6”,原因是当表达式存在有符号类型和无符号类型时所有的操作对象都自动转换为无符号类型,因此-20变成一个非常大的整数与6相加,所以该表达式计算出的结果大于6.
    2. [h1]9、strncpy和snprintf的正确用法[/h1][list=1][*][code]//strncpy的正确用法:
    复制代码
    1. strncpy(dest,src,sizeof(dest)-1);
    复制代码
    1. dest[strlen(dest)] = ‘\0’;
    复制代码
    1. //snprintf的正确用法:
    复制代码
    1. snprintf(dest, sizeof(dest)-1, “%s”, src);
    复制代码
总则:
  • snprintf的使用比strncpy简洁
  • snprintf可以获取被拷贝的字节数
  • 二者都有性能问题,如果src长度远大于dest,用strncpy,否则用snprintf。
[h1]10、printf中%5.3s,这样的怎么看?[/h1]
    1. int main(void)
    复制代码
    1. {
    复制代码
    1.     printf(“%s, %5.3s\n”, “computer”, “computer”);
    复制代码
    1.     return 0;
    复制代码
    1. }
    复制代码
输出:computer,com
  • %5.3s 或者是 %5.3d 中小数点后面表示输出的最大宽度,小数点前面的表示输出的最小宽度;
  • %5.3f则表示输出场宽为9的浮点数, 其中小数位为3, 整数位为1, 小数点占一位, 不够9位右对齐;
  • 默认都是右对齐, 若是%-7s则输出左对齐




分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:10
帖子:2
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP