前言
xxx公司的入门级别面试。先让我做了普及组的第三题,我半个小时就一A了。最后反馈是算法能力还ok,但是试讲和表达能力可能相对欠缺。接下来重点复盘我的试讲部分。我将描述试讲题目、原来的讲解,反思,以及修改后的讲解四部分。
题目
题目是找出1~n之间的真数,真数的定义是因子之和等于数字本身,那么就是真数。
我的讲解
我当时直接讲了怎么判断一个数字是不是质数,帮助学生回忆怎么求质数
bool isPrime(int n) {
bool ret=true;
for(int i=2;i<=n-1;i++) {
if (n%i==0) ret=false;
}
return ret;
}
然后我说,判断一个数字是不是真数也是类似的,对以上程序进行修改,可以得到以下程序:
bool isZhen(int n) {
int sum=0; //原来的ret要改成sum,因为要统计因子之和
for(int i=1;i<=n-1;i++) {//i的范围应该改成1~n-1
if (n%i==0)
sum+=i; //本来是ret=false表示不是质数,这里计算的是因子之和
}
return ret==n;//判断因子之和是不是n,如果是则是真数。
}
讲完了。我说如果还需要补充,那么可能要一行行调试演示每一行再做什么,因为很多同学可能if和for都用不利索。
关于怎么调动孩子的积极性,我回答了一个是运用激励制度,回答题目有积分,积分可以换礼物;另一个是我上课前做做题,培养自己的热情。
之后就收到hr的反馈,觉得我试讲和表达能力欠缺。
反思
表达能力是我绕不过去的一个坎。我觉得面试不是很好也是有点因为我轻敌了,当时在赶着回家,有点着凉,我也没好好想过应该怎么面。看了知乎的一个回答,感觉确实得改改了
程序员的语言表达能力欠缺是为什么?该怎么锻炼? - 李鹏的回答 - 知乎
里面提到了一点,程序员的思考逻辑和生活中是不太一样的,程序员要求过程中不能出错,就像程序一样中间有一点错就不能运行了。而正常人接受的方式是整个逻辑要理顺,细节即使出错也可以自动纠偏。所以我觉得我上面的讲解方式也应该改一改。
修正后的版本
我们要找到1~n之间的所有真数,那么需要枚举1~n之间的每一个数字,然后再判断这个数字是不是真数。判断一个数是不是真数,需要将它的因子之和求出来。判断一个数是不是它的因子,只需要判断n%i是不是等于零就可以了。
我们正着来看:
首先,我们枚举1~N之间的每一个数字n,现在判断它是不是真数,那么就要统计n的因子之和。
统计n的因子之和,需要枚举1~n-1之间的所有数字i,如果if (n%i==0),那么说明i是n的因子,i就要加进n的因子之和sum中。
最后判断sum是不是等于n就可以了。为了更详细地描述,代码如下:
bool isZhen(int n) {
int sum=0;
for(int i=1;i<=n-1;i++) {
if (n%i==0)
sum+=i;
}
return ret==n;
}
int main(){
int N;
cin>>N;
for(int n=1;i<=N;i++)
if (isZhen(n)) cout<<n<<endl;
}
我们从main开始看,首先读入N,接下来判断1~\N之间每一个数字n是不是真数。判断真数的函数里面,要枚举n的每一个因子i,如果i是n的约数,那么sum就加上i。
作为拓展,我们可以复习一下怎么求质数的代码。
bool isPrime(int n) {
bool ret=true;
for(int i=2;i<=n-1;i++) {
if (n%i==0) ret=false;
}
return ret;
}