在线OJ
想要提升自己的独立编程以及思考能力,刷题是必不可少的一种途径。而很多朋友不知道在哪刷题,怎么刷题,在这里我推荐在线OJ的形式,目前很多企业面试都采用的是这种方式,可以很好地查验程序员的水平能力。
简单推荐2个刷题网站:牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网
这期主要讲的是牛客网上的C语言相关题目。一个类型的我会做一个统一讲解,希望能得到大家支持!
牛客网 循环输出图形类题
先来看两道简单的练练手。
题目1(牛客98题):
这题主要就是一个多组输入需要注意一下,这在我之前的一篇博客:https://mp.csdn.net/mp_blog/creation/editor/124146724 有具体介绍,我们直接来看一下这题的代码:
当然也可以用while循环来写,效果是一样的。
牛客网99题和这道类似,就是多组打印正方形图案罢了,相信大家也没问题,这里指提供一下代码,主要还是讲下面的题目
题目2(牛客100题):
审题:多行输入,那么先将行数设出来放入循环中。 然后观察图形,是一个直角三角形,且行数与列数相等,那么我们就可以想到,嵌套两个循环将行和列 表示出来。外层表示行,内层表示列,这里每一列的内容要想清楚,是下层比上层多一字符。
代码如上图,要注意,每一列结束要记得换行,总是有人会将换行加在循环内。
牛客网101题和这题类似,只是将三角形倒了过来,其实本质还是一样的,只是列从上到下字符减少罢了,代码如下:
题目3(牛客102题):
这种打印图形带空格的题目也是相当经典,我们碰到时,可以分两部分考虑,先打印空格,再打印其他字符图形。
观察图形:是个翻转的直角三角形,并且行列相等。 第一行有(行数-1)个空格,下面几行的空格依次减少,同时 ‘ * ’ 个数是相反的规律。
依据上述分析,我们可以写出相应代码。
牛客网103、104题,金字塔的题目也是和此类似,主要注意空格和字符分别打印就行了,套路基本都是一样的。
再来看 题目4(牛客105题):
这种类型的题看上去和上面的差不多,但是需要注意它是以中间一行为轴上下对称的,所以这种类型有两种思路:1、分为上半部分、中间轴和下半部分打印 2、将轴归到上半部分(或下半部分)打印。 两种思路我们分别来看一下:
第一种:
第二种:
牛客网后面106~110题都是类似的套路去做,将上下部分 分开去做,多观察图形 多思考就能掌握了。
上述题目还可以引深一下,既然每一行字符数相差可以为1,那也可以为2,3......
比如这道题:
每行字符数差值为2,同样也可以分为上下两部分去做,关键在于怎样表示这里每行的字符个数。
可以发现行差是等差数列 1,3,5... 就能采用等差数列公式去表示每行的字符。
代码如下:
以 2*i-1 约束字符个数,就可以达到效果。同样的,如果是行差为3,为4...... ,也都是类似的方法。
题目5(牛客网111题):
这类题目可以看成是一个内部都填满的图形将中间掏空得到的图形。
思路:在正方形的基础上加上一些限制条件将内部掏空。
这题的话,就是以行数和列数为限制条件掏空内部,代码如下:
同样的112题也是这道理:
这里的限制条件就变成了 :行数、列数以及对角线。
题目6(牛客114):
牛客网上循环输出图案还有两道相对来说综合一些的题目,就是最后两道关于圣诞树的题目:
先看114题:
首先看到这题我们不要被吓到,只不过相较于前面一些基本图案,要稍微复杂综合一些,只要把它想象成多种简单图形的组合就可以做出来。
第一步,观察图形,这个圣诞树其实可以看做是树干、树柄两个部分组成的,而上面的树干部分又可以看成由多个小三角形组成的,并且它们的组成也有规律。
第二步:看输入对应的图案,输入2,对应出现的是两层小三角形、长为2的树柄构成的图案,输入3,对应的就是3层小三角形图案,长为3的树柄构成的小三角形。
第三步:观察其中空格的规律:自上至下左右空格都在依次减少1,小三角形的第一层 * 与 *之间都差5个空格,第二层差3,第三层差1 。
观察到这些后,我们就可以开始尝试写一写了。
一、先输入高度,根据上面分析,我们知道层数是高度*3,所以再设一个值,放层数。
二、将圣诞树分成两部分打印,先打印树干、再打印树柄。
三、树干部分以输入为条件将其分层(小三角形),输入2就有2层,输入3就有3层。
for (i = 1; i <= h; i++)
将一层小三角形当成一个整体,进行循环,这里我们要思考怎样控制循环继续和结束,就是用层数控制。
四、一层里面有三行,我们一行一行打印,第一行:
for (int a = n - 1; a > 0; a--)
{
printf(" ");
}
for (k = 1; k <= i; k++)
{
printf("* ");
}
printf("\n");
这里空格的控制还需要一个变量,我们可以发现2层树第一层空格数为5, 3层树空格数为8,也就是3*h-1 。 * 字符通过层数来控制,一层就是一个 * ,后面的空格忽略,到2层就是* * ,打印完后换行。
第二行,同样的:
for (int b = n - 2; b > 0; b--)
{
printf(" ");
}
for (k = 1; k <= i; k++)
{
printf("* * ");
}
printf("\n");
第三行:
for (int c = n - 3; c > 0; c--)
{
printf(" ");
}
for (k = 1; k <= i; k++)
{
printf("* * * ");
}
printf("\n");
这是一层小三角形的打印,我们根据高度h来确定层数,所以再循环的最后加上一个n=n-3,作为循环的结束条件,就能实现层层打印。
详细代码如下:
五、打印树柄,这就比较简单了。规律就是:输入的高度h对应树柄的长度。
最后来看一下效果:
我们的圣诞树就完成了!
下面的115题和这个是类似的,相信大家有能力自己完成的吧!