c/c++面试总结---c语言基础算法总结2

c/c++面试总结---c语言基础算法总结2


算法是程序设计的灵魂,好的程序一定是根据合适的算法编程完成的。所有面试过程中重点在考察应聘者基础算法的掌握程度。

上一篇讲解了5中基础的算法,需要在面试之前熟练掌握,本篇讨论剩余的基础算法。

先看一个面试题目:设计一个函数,求一个给定字符串中所有数字的和。
例如:给定字符串 “abc12fas123dfaf34”,
计算结果为:12 + 123 + 34 = 169
其中包括了:求和方法、字符串遍历方法、数字字符转成数字的方法
多位数字组合成整数的方法
必须熟练掌握以上四种基础算法,才能解决该问题
参考方法:
while(str[i] != '\0')
{
while(str[i]是数字字符)
{
数字字符转换成数字
数字组合成整数
}
求和
while(str[i]是非数字)i++

}

6、数组或者字符串逆序的算法:
基本思想:获取数组的长度len,首尾元素依次交换,共计循环len/2次
模型:
for(i = 0;i < len/2;i++)
{
array[i]<===>array[len - 1 - i]
}
7、排序算法:
排序的算法常用多种:需要熟练掌握选择排序和冒泡排序
基于数组array,数组的长度为len

选择排序模型:
for(i = 0;i < len - 1;i++)
{
for(j = i + 1;j < len;j++)
{
if(array[i] > array[j])
{
array[i]和arry[j]交换
}
}
}

依次用第一个数和其它所有的数进行比较,如果大于则交换两个数,再用第二个数和
剩余的数比较,如果大于则交换,依次循环直到倒数第二个数为止

冒泡排序模型:
for(i = 0;i < len - 1;i++)
{
for(j = 0;j < len - i;j++)
{
if(array[j] < array[j + 1])
{
array[j]和array[j+1]进行交换
}
}
}

每比较一次,让最大的数沉底,依次循环,则由小到大排好序。

8、处理英文字符串的时不区分大小写的方法
利用ascii码的规则,大写字母和小写字母的ascii码仅有第5位不同,其它位保持
一致,所有判断的方法是:
两个字符串存于str1和str2中
if((str1[i] | 0x20) == (str2[i] | 0x20))
str1[i]和str2[i]两者都是大写或者小写字母,则表达式成立
str1[i]和str2[i]一个是大写,另一个小写或者反之,则表达式同样成立
用来处理大小写不敏感的情况

9、数组上插入或删除的算法
数组上插入元素的方法:
寻找插入位置,移动元素空出位置,插入元素
插入算法模型:
寻找插入的位置-->index
循环空出位置
for(i = len - 1;i >= index;i--)
array[i + 1] = array[i]
元素插入空位置
array[index] = 数据
数组上删除元素的方法:
查找要删除的元素,移动删除元素,数组有效数据个数减一
查找元素的位置-->index
删除元素
for(i = index;i < len;i++)
{
array[i] = array[i + 1]
}
元素个数len减一:len = len - 1

10、基于链表的操作:
遍历、查找、删除、插入
遍历查找模型:
p = 头指针
while(p != NULL)
{
通过p获取数据
p = p->next
}
删除算法模型:
遍历找到要删除的节点-->p
记录待删除节点的前一个节点指针-->q
删除节点:
q->next = p->next;
free(p)
插入算法模型:
遍历链表找到插入位置前一个节点指针-->p
待插入节点指针-->q
插入节点:
q->next = p->next;
p->next = q

熟练掌握以上各种编程算法,理解编程的基本思想,通过勤加练习摸索出适合自己的
编程思维。将现实的问题转换成计算机的程序,是需要算法作为中间媒介的,所以算法
的设计要与人的习惯思维保持一致,才能使程序易读和易修改。



猜你喜欢

转载自www.cnblogs.com/huangtuyuan/p/10523789.html