学着C语言数组,最害怕的便是一字一句死记硬背那个语法。就在今天的这15个编程题目里,每一个都是在面试以及笔试当中高频出现的实战场景,从随机数生成开始一直到经典算法,一步一步亲自带着学会用代码来表达意思。不说多余复杂的句子,直接去看究竟要怎样把这些题目切实运行成功。
一维数组的生成与基础操作
随机数填充数组
在编写C程序时,第一步常常是去生成测试数据,借助rand函数并配合srand设置种子,如此方可获取真正的随机数,举例来说,若要得到10个处于0到99范围之内的数,其代码即为array[i]=rand%100,在实际开展开发工作的进程中,针对模拟传感器数据以及游戏抽奖概率等情况,运用的均是这样的一套逻辑,别忘了添加头文件stdlib.h和time.h。
输出数组的两种方式
用for循环遍历下标来进行输出是最为简单的,新手容易出现的错误是数组下标从0起始,若将循环条件写成i<=10这种形势就会导致越界事故了,调试期间能够每输出5个数字便更换一行,如此观察数据会较为直观,许多嵌入式设备串口打印日志,采用的也是这种逐个元素进行输出的思路。
数组统计与排序实战
最大值最小值的查找
定义两个变量,分别是max和min,将它们的初始值都设定成数组的第一个元素,在进行遍历的时候,逐个进行比较并且予以更新。去年我帮助一个学弟调试代码,他令max等于0进行初始化,结果数组当中全都是负数,最大值输出为0就出现错误了。所以初始值一定要选取数组里的值,这属于细节方面容易出现问题的地方。
总和与平均值的计算
循环用于进行累加,需要注意平均值的类型转换。整数数组直接做除法会导致小数部分丢失,应写成(float)sum/10那样的形式。金融系统里的交易流水汇总,其本质就是这样一个累加的过程。若数据量超过一万,还得考虑sum可能出现溢出的情况,此时要用long或者long long。
冒泡排序手写实现
二层循环之中,外面的圈层来把控轮次数量,而里面的圈层则分别进行双方之间的对照并实施交换操作。所谓升序,即处于前面的数值大于处于后面之数值时就要进行位置互换。在二零二二年开展的华为od机考里面曾经考过此类题目,好多人径直运用qsort函数,然而却被问到该函数底层的实现方式而被难住。亲手书写冒泡排序并非是为了炫耀技能,而是对逻辑基础进行考查。
数组元素的增删改查
逆序输出不改变原数组
将下标进行倒着遍历,从数字9开始一直到数字0,然后输出就行。要是存在真正逆序存放的要求,那么就必须要进行前后对称的交换操作。在游戏里面排行榜呈现倒序显示的情况,就是按照这样的方式来处理的。需要注意在交换的时候,中间变量可不要丢失了值。
有序数组插入新元素
先是在按照升序排列的数组之中插入一个数,要先去寻找到插入的位置,接着把处于该位置以及在该位置之后的所有元素全部都向后移动一位,最后再进行赋值操作。在银行系统里对于用户年龄进行排序之后插入新用户,这便是标准的插入排序思想。移动元素必须要从后往前进行循环,不然的话就会覆盖数据。
二分查找定位元素
其前提在于数组已然完成排序,每次去选取中间的下标,将目标值跟中间元素展开比较,从而缩小一半的查找范围,要求输出的乃是第几个元素,把下标加上1便可以,在开发搜索引擎索引之际,二分查找属于底层的基本功,其效率远比遍历要高得多。
经典算法与数学问题
斐波那契数列前40项
第三项起的数列,每一项是前两项的和,以数组存储,用于循环递推,注意第40项数值极大,int无法存储,需用long long,股票涨幅预测模型常参考此类递推关系。
筛选法求100以内素数
创建一个布尔类型的数组,初始状态下全都设定为表示素数的状态。从数字2开始,将2的所有倍数都标记为属于合数的状态,接着是3的倍数,按照这样的方式依次类推。最终没有被标记的那些数就是素数。这种被称作埃拉托色尼筛法的方法,早在两千多年以前就已存在,直至现在还应用于RSA加密算法当中。
杨辉三角输出10行
行数的开头结尾均为1,中间的数是上一行相邻两个数相加的和,以二维数组进行存储,要留意第n行存在n + 1个数,二项式定理将其展开所得到的系数,以及概率论当中的二项分布,所运用的都是杨辉三角的数值。
二维数组与特殊矩阵
矩阵转置
让三行四柱转变为四行三列,关键在于行列下标进行互换,输出期间要留意两层循环的界限,在图形学范畴内图像发生旋转,其原理即为矩阵转置,自行手写进行实现之后,方可明白openCV库函数背后的操作。
魔方阵构造
5阶的魔方阵,每一行、每一列以及对角线的和都是相等的。其构造的口诀是,1放置在首行的正中间位置,然后朝着右上方填数,要是遇到边界就进行反弹,要是遇到冲突就向下移动。很多游戏当中的九宫格解密,其实就是魔方阵的变种。代码的实现涉及到大量的下标边界判断。
鞍点查找
首先去寻找每一行之中的最大值,接着再去判断这个值是不是所在列的最小值,需要注意的是有可能存在多个鞍点或者根本没有鞍点,股票K线图的支撑位以及阻力位,实际上就是对于这种局部极值点的判断,使用两层循环进行嵌套,其时间复杂度为O(n平方)。
字符串与字符处理
字符统计器
进行这样一个操作,输入一个以行为度量的字符串,对其中存在的大写字母、小写字母、数字、空格以及其他字符分别予以统计,借助getchar以循环方式读入字符,直至遇到换行符才停止读入,通过判断字符对应的ASCII码范围来进行分类,像大写字母对应的ASCII码处于65至90这个区间内,文本编辑器当中的字数统计功能其底层逻辑便是如此这般。
字母密码翻译
从A转变为Z,由B变换成Y,进行对称式的替代更换。大写字母的加密公式为:ch等于'A'加上'Z'再减去ch;小写字母的情况同样如此。在第二次世界大战时期英格玛机所采用的替换密码,其原理与之相类似。需要注意的是,非字母的部分保持原样留存。
手动字符串连接
需避免使用strcat函数,自行寻觅第一个字符串结束符所处位置,接着将第二个字符串中的字符逐个进行复制动作。要确保目标数组具有足够大的空间。在嵌入式开发当中,由于内存有限,所以常常需要自己亲自手写这类基础函数。
观摩完这十五个数组编程题目,哪一种类型的题目是你认为最为耗费脑力的?是二分查找这一类型,还是魔方阵这一类型?欢悦且诚挚地在评论区域畅所欲言你所遭遇的妨碍解题的关键要点,动手点亮并收藏此篇文稿,往后再度书写有关数组的内容之时便无需再求助他人。

Comments NOTHING