C语言面试算法真题集(企业实操版)_第1页
C语言面试算法真题集(企业实操版)_第2页
C语言面试算法真题集(企业实操版)_第3页
C语言面试算法真题集(企业实操版)_第4页
C语言面试算法真题集(企业实操版)_第5页
已阅读5页,还剩4页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言面试算法真题集(企业实操版)本套试题适配初级、中级C语言开发岗位面试,涵盖数组、字符串、链表、排序、查找、递归六大高频算法考点,全部为互联网、嵌入式企业常考手写代码题型,无偏题怪题,侧重代码功底和逻辑思维。所有题目均可纯C语言实现,无需依赖第三方库。一、基础算法(必考题)题目1:字符串反转(原地反转)题目描述:实现一个C语言函数,输入一个字符串,在原内存空间内完成字符串反转,不允许开辟额外同等大小数组,不使用库函数反转接口。考察点:字符串遍历、指针操作、边界处理、原地算法思维参考代码:c

#include<stdio.h>

//字符串原地反转函数

voidstrReverse(char*str)

{

if(str==NULL)

return;

//计算字符串长度

intlen=0;

char*p=str;

while(*p!='\0')

{

len++;

p++;

}

//首尾双指针交换

inti=0,j=len-1;

chartemp;

while(i<j)

{

temp=str[i];

str[i]=str[j];

str[j]=temp;

i++;

j--;

}

}

intmain()

{

charbuf[100]="helloworld";

strReverse(buf);

printf("反转结果:%s\n",buf);

return0;

}解题要点:必须做空指针判断,避免程序崩溃;采用双指针首尾交换,空间复杂度O(1),符合原地算法要求。题目2:数组去重(有序数组)题目描述:给定一个升序排列的int数组,去除数组中重复元素,返回去重后的数组有效长度,原数组前N位存储去重后数据。考察点:数组遍历、快慢指针算法、有序数组特性参考代码:c

#include<stdio.h>

//有序数组去重,返回有效长度

intremoveDuplicate(intarr[],intn)

{

if(n<=1)

returnn;

//慢指针:记录有效元素位置

intslow=0;

//快指针:遍历所有元素

for(intfast=1;fast<n;fast++)

{

//元素不重复,慢指针后移并赋值

if(arr[fast]!=arr[slow])

{

slow++;

arr[slow]=arr[fast];

}

}

returnslow+1;

}

intmain()

{

intarr[]={1,2,2,3,3,3,4};

intlen=sizeof(arr)/sizeof(arr[0]);

intnewLen=removeDuplicate(arr,len);

printf("去重后数组:");

for(inti=0;i<newLen;i++)

{

printf("%d",arr[i]);

}

return0;

}解题要点:利用有序数组重复元素相邻的特点,快慢指针一次遍历即可完成去重,时间复杂度O(n),是面试高频最优解。二、递归与数学算法题目3:斐波那契数列(非递归+递归两种实现)题目描述:输出斐波那契数列前n项,数列规则:F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2)。要求分别写出递归实现和非递归实现,并说明优劣。考察点:递归思想、算法复杂度、代码优化思维参考代码:c

#include<stdio.h>

//递归实现(简单但效率低)

intfibRecur(intn)

{

if(n==1||n==2)

return1;

returnfibRecur(n-1)+fibRecur(n-2);

}

//非递归实现(迭代,效率高)

intfibIter(intn)

{

if(n==1||n==2)

return1;

inta=1,b=1,c;

for(inti=3;i<=n;i++)

{

c=a+b;

a=b;

b=c;

}

returnb;

}

intmain()

{

intn=10;

printf("前10项斐波那契数:");

for(inti=1;i<=n;i++)

{

printf("%d",fibIter(i));

}

return0;

}面试必答亮点:递归代码简洁但存在大量重复计算,时间复杂度O(2ⁿ),n较大时栈溢出;迭代法时间复杂度O(n),无冗余计算,工程中优先使用。题目4:整数逆序输出题目描述:输入一个int整数,将数字逆序输出,不允许使用字符串转换,需处理正负号(如输入-123,输出-321)。考察点:取模、整除运算、边界逻辑处理参考代码:c

#include<stdio.h>

intreverseNum(intnum)

{

intres=0;

while(num!=0)

{

//取末尾数字

inttail=num%10;

res=res*10+tail;

num=num/10;

}

returnres;

}

intmain()

{

intnum;

scanf("%d",&num);

printf("逆序结果:%d\n",reverseNum(num));

return0;

}三、排序与查找算法(核心面试题)题目5:手写冒泡排序题目描述:手写冒泡排序算法,对int无序数组进行升序排序,优化冒泡排序的无效遍历。考察点:基础排序原理、代码优化能力、双层循环逻辑参考代码:c

#include<stdio.h>

//优化版冒泡排序

voidbubbleSort(intarr[],intn)

{

for(inti=0;i<n-1;i++)

{

//标记本轮是否发生交换,无交换则数组已有序,直接退出

intflag=0;

for(intj=0;j<n-1-i;j++)

{

if(arr[j]>arr[j+1])

{

inttemp=arr[j];

arr[j]=arr[j+1];

arr[j+1]=temp;

flag=1;

}

}

if(flag==0)

break;

}

}

intmain()

{

intarr[]={5,2,9,1,5,6};

intlen=sizeof(arr)/sizeof(arr[0]);

bubbleSort(arr,len);

printf("排序后:");

for(inti=0;i<len;i++)

{

printf("%d",arr[i]);

}

return0;

}面试要点:基础冒泡未优化时,有序数组仍会完整遍历;增加交换标记后,最优时间复杂度可优化至O(n)。题目6:二分查找(折半查找)题目描述:给定有序升序数组,手写二分查找,查找目标值,返回数组下标,无目标值返回-1。考察点:二分算法核心、边界条件处理、溢出规避参考代码:c

#include<stdio.h>

//二分查找(有序数组)

intbinarySearch(intarr[],intn,inttarget)

{

intleft=0;

intright=n-1;

while(left<=right)

{

//规避(left+right)溢出问题

intmid=left+(right-left)/2;

if(arr[mid]==target)

{

returnmid;

}

elseif(arr[mid]<target)

{

left=mid+1;

}

else

{

right=mid-1;

}

}

return-1;

}

intmain()

{

intarr[]={1,3,5,7,9,11,13};

intlen=sizeof(arr)/sizeof(arr[0]);

intpos=binarySearch(arr,len,7);

printf("目标下标:%d\n",pos);

return0;

}面试加分点:不使用(left+right)/2计算中间值,避免两数相加溢出,是工程规范写法。四、链表算法(嵌入式/后端高频)题目7:单链表反转题目描述:定义单链表结构,手写迭代法实现单链表整体反转,返回反转后的链表头节点。考察点:链表结构理解、指针操作、链表遍历逻辑参考代码:c

#include<stdio.h>

#include<stdlib.h>

//定义单链表节点

typedefstructListNode

{

intval;

structListNode*next;

}ListNode;

//链表反转(迭代法)

ListNode*reverseList(ListNode*head)

{

ListNode*pre=NULL;

ListNode*cur=head;

ListNode*temp;

while(cur!=NULL)

{

//保存后续节点

temp=cur->next;

//反转当前节点指向

cur->next=pre;

//指针后移

pre=cur;

cur=temp;

}

returnpre;

}

//辅助:创建新节点

ListNode*createNode(intval)

{

ListNode*node=(ListNode*)malloc(sizeof(ListNode));

node->val=val;

node->next=NULL;

returnnode;

}

//辅助:打印链表

voidprintList(ListNode*head)

{

ListNode*p=head;

while(p!=NULL)

{

printf("%d",p->val);

p=p->next;

}

}

intmain()

{

//构建链表1->2->3->4

ListNode*head=createNode(1);

head->next=createNode(2);

head->next->next=createNode(3);

ListNode*newHead=reverseList(head);

printf

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论