随笔分类 - C面试常见问题
C面试常见问题
摘要:首先看如下代码:1 int main(int argc, char** argv)2 {3 int a[5] = {1,2,3,4,5};4 int* ptr = (int*)(&a + 1);5 printf("%d,%d\n", *(a+1), *(ptr-1));6 return 0;7 }这道题在很多所谓经典C语言面试题里是常见的不能再常见,你知道输出结果吗?答案是:2,5但是仍有许多人不能答对,也包括当初的我。这道题简简单单,但是考察了不少于如下内容:数组指针、数组首地址概念、数组指针和数组首地址和数组首元素地址之间的关系,指针运算规则,指针类型,in..
阅读全文
摘要:算法探讨——再议经典算法问题:求最大子序列和、绝对值最大子序列和以及其区间给定任一数字序列,如{-5,4,-20,16,-2,-3},求出其最大子序列和,绝对值最大子序列和以及对应的区间,在这个例子中,人肉计算可知最大子序列和为16,区间为[3,3)(数组下标从0开始),而绝对值最大子序列和为-21,区间为[0,2],那么算法如何描述及实现呢?在经典的书籍《数据结构与算法分析 C语言描述第2版》中,作者向我们介绍了求最大子序列和的三种算法,时间复杂度从O(N3)下降到O(N),求最大子序列和绝对值和以及其区间是我对这一问题的扩展。一、求最大子序列和以及其区间求最大子序列和的算法相对简单,并且可
阅读全文
摘要:通过迭代(非递归)及递归将单链表逆序老生常谈的问题了,不过很多地方面试还是很喜欢问这个问题。实际工程中感觉用处不大,需要逆序的存储为什么要选择单链表呢?为什么不用list(in c++)或iterator(in any language)?或者将数据全部推入栈中再依次弹出。说了这么多有点无聊了,参看酷壳的《我为什么反对纯算法面试》。迭代(非递归)算法描述:设置两个临时指针prev和next分别标记当前结点的前驱和后继,将当前结点的next指针指向前驱,然后把前驱指针替换为当前结点,当前结点替换为next,即向“后”移动,直到链表空了(next为NULL)。C/C++实现: 1 typedef
阅读全文
摘要:C堆上申请二维数组之前写了一篇《C++堆上申请二维数组》,应该说C++的方式相对于C还是更简单容易理解一些,那么C如何写呢?方法一:通过数组指针申请连续的空间 1 #include <stdio.h> 2 #include <stdlib.h> 3 int main() 4 { 5 // 申请a[3][2]三行两列二维数组 6 int (*a)[2] = (int(*)[2])malloc(sizeof(int)*3*2); 7 a[0][0] =1; 8 a[0][1] =2; 9 a[1][0] =3;10 a[1][1] = 4;11 ...
阅读全文
摘要:判断单链表是否存在环及求环入口点算法描述:1、先判断是否有环设置两个指针(fast, slow),初始值都指向头,slow每次前进一步,fast每次前进二步,如果链表存在环,则fast必定先进入环,而slow后进入环,两个指针必定相遇。(当然,fast先行头到尾部为NULL,则为无环链表) 1 bool isExitsLoop(list *head) 2 { 3 list *slow = head, *fast = head; 4 5 while ( fast && fast->next ) 6 { 7 slow = slow->next; 8 ...
阅读全文