在毕业刚在第一家的公司的时候,项目经理有一次跟我们吐槽说面试一个水客(就是简历上精通C/C++)。聊了几句话,发现那个面试的人水分很大,现场出了一道笔试题。
题目,用c语言打印一个等腰直角三角形效果,三角形腰边长度为四个星星。效果如下
*
**
***
****
当然临场发挥给出来的题目,实际上就是在纸上画几个星星,让面试者笔试,不会有“等腰直角三角形”这种描述,这题目是我脑 (yi)补(yin)出来的。
面试者拿过纸来大手一挥,写出如下答案:
面试者拿过纸来大手一挥,写出如下答案:
printf("*\n");
printf("**\n");
printf("***\n");
printf("****\n");
“很好,还有别的实现方法吗”经理夸奖道
“没有了”
“那好,写个1000行的”
“……”,面试者哑口无言,心中万马奔腾。
面试结果可想而知。
后来开会跟我们组员说个这次面试顺便吐槽我们组开发编码考虑不周全,第一反应该有两种方法,一种两个循环,一种一个循环。
时间过得好快,转眼间五年过去了,那会还没完全毕业,只是大四下半年在那家公司实习(当然毕业后还是一直待在哪儿),因为这个面试题太经典了,印象忒别深刻,就是不同水平的开发者都能做出这个面试题。今天就趁着深圳大雨,宅在家整理一下实现方案。
时间过得好快,转眼间五年过去了,那会还没完全毕业,只是大四下半年在那家公司实习(当然毕业后还是一直待在哪儿),因为这个面试题太经典了,印象忒别深刻,就是不同水平的开发者都能做出这个面试题。今天就趁着深圳大雨,宅在家整理一下实现方案。
方法一、单刀直入,直接printf
printf("*\n");
printf("**\n");
printf("***\n");
printf("****\n");
方法二、printf双循环
外层循环负责换行,内层循环负责打印星星
printf("print by function %s\n", __func__);
for (int i = 0; i < num; i++) {
for (int j = 0; j < i + 1; j++) {
printf("*");
}
printf("\n");
}
方法三、数组赋值
定义一个空字符串,然后在循环中递增赋值星星
char *temp = new char[num + 1];
memset(temp, 0, num + 1);
for (int i = 0; i < num; i++) {
*(temp + i) = '*';
printf("%s\n", temp);
}
delete[] temp;
temp = NULL;
方法四、字符串拼接
定义一个空字符串,然后在循环中递增拼接星星
char *temp = new char[num + 1];
memset(temp, 0, num + 1);
for (int i = 0; i < num; i++) {
printf("%s\n", strcat(temp, "*"));
}
delete[] temp;
temp = NULL;
方法五、snprintf控制打印输出
char *temp = new char[