以前我参加过中兴的招聘,招聘老师给我出了一道题目,int n = 3,4;我说我不知道,这是变态的用法,我们不应该这样用,您也不应该出这样的题目。可能当时年轻气盛,将招聘老师气了个半死,我当然也无缘中兴了。
吸取以前的教训,后来我在组织招聘时,有一个基本原则,只有在工作中经常会用到的知识,才会作为考察的范围。
大部分人都是缺判据,也有一些人性格比较谨慎,习惯写一大堆的判断条件,如下面这种的:
if (m > 0 && n > 0 && m > n && m < 30 && n < 30) {
……
}
总之,都没有抓住判断条件应该完备且简洁的基本准则,实际上该例子很简单,只要简单的分析,判断条件也就三个,如下:
1.内菱形高度大于等于0;
2.外菱形高度小于约定之(假设30);
3.外菱形高度大于内菱形高度;
写成程序示意如下:
if (n >= 0 && m > n && m < 30) {
……
}
此时,结论已经很形象了,每行输出的空格从m-1递减,每行输出的*从1开始递增,循环子为m,程序示例如下:
for (i = 1; i <= m; i++)
{
j = m - i;
while (j--)
printf(" ");
j = i * 2 - 1;
while (j--)
printf("*");
printf("\n");
}
程序示例如下:
for (i = 1; i <= m; i++)
{
j = m - i;
while (j--)
printf(" ");
j = i * 2 - 1;
for (k = 0; k < j; k++)
{
if (k < m-n || k >= j-m+n)
printf("*");
else
printf(" ");
}
printf("\n");
}
外菱形的四条边我们用表达式描述出来,如下:
(+x) + (+y) < m
(-x) + (+y) < m
(+x) + (-y) < m
(-x) + (-y) < m
合并后的表达式为:abs(x)+abs(y)<m,此时的程序示意如下:
for (x = -m; x <= m; x++)
{
for (y = -m; y <= m; y++)
{
t = abs(x) + abs(y);
if (t >= n && t <= m)
printf("*");
else
printf(" ");
}
printf("\n");
}
我们首先拿最优秀的实现开刀,在上一节最后,分享了一个很优美的实现,示例如下:
for (x = -m; x <= m; x++)
{
for (y = -m; y <= m; y++)
{
if (abs(x) + abs(y) >= n && abs(x) + abs(y) <= m)
printf("*");
else
printf(" ");
}
printf("\n");
}