程序员“火柴棍式”的烧脑面试题

2023-09-21 16:38:02 浏览数 (1)

0x01 - 从耗子叔博客看到的题目

“火柴棍式” 的面试是在看耗子叔的博客时看到的,引入耗子叔的内容如下:

有时候,有些面试题是很是无厘头,这不,又有一个,还记得小时候玩的的“火柴棍游戏”吗,就是移动一根火柴棍改变一个图或字的游戏。程序面试居然也可以这么玩,看看下面这个火柴棍式的程序面试题吧。 下面是一个C程序,其想要输出20个减号,不过,粗心的程序员把代码写错了,你需要把下面的代码修改正确,不过,你只能增加或是修改其中的一个字符,请你给出三种答案。 int n = 20; for(int i = 0; i < n; i--) { printf("-"); } https://coolshell.cn/articles/3961.html

开始以为是一些比较以前见过的一些变态题目,比如考察编译选项、数组越界之类的题目,结果没想到竟然是“脑筋急转弯”。在看答案之前,真的是花了点时间,才想出一种方法。看完答案以后恍然大悟,竟然可以这样,哈哈!晒一下耗子叔给出的答案。

//第一种解法:在for循环中给n加一个负号 for(int i = 0; i < -n; i--) //第二种解法:把 n 初始化成 -20 int n = -20; //第三种解法:把for循环中的 i 初始化成40 for(int i = 40; i < n; i--) https://coolshell.cn/articles/3961.html

0x02 - 对这种题目的看法

于是我把这个题目发到一个微信群里,给群友们看看,但是直接得到下面的答复。

发出去之后,唯一一个接话的竟然这样说。其他的群友对这个问题直接无视。不知道他们为什么对这种搞怪的“脑筋急转弯”没兴趣!

感觉看到这样的答复也不奇怪吧,毕竟没啥用,第一没人这么写,第二也没有实际的意义。但是这竟然是面试题。

想起以前学习 C 语言的时候,一个老师说过这么四句话,这几句话我印象深刻(尤其是第四句话,希望大家先收藏再观看)。

  • 熟练掌握 C 语言各种语法
  • 深入了解编译器对 C 语言编译的处理
  • 写出不受编译器限制的 C 代码
  • 其他牛角尖问题一概无视

上面的四句话,都不是原话,即使印象深刻也不知道到底是不是这四句话,但是大概就是这么个意思。从第四句话来看,这算不算牛角尖问题呢?不知道啊!

以前见过有的公司面试,就面试类似 /-- ,这种自增的题,有的学校考试也考这种题吧。

比如 i i 这样的。反正这样的题我是不会,而且更重要的是不同的编译器竟然结果不同。对这种运行结果依赖编译器的情况,我们称之为“编译器相关”。就是你别让我猜,你自己在编译器上跑吧!其实,C 语言标准里对于有些语法给出的说明就是,实现方自行处理,就是没有给出具体标准。

0x03 - 剩下问题的答案

其实上面虽然这么说,但是我很无聊的看了看,类似“脑筋急转弯”题目的变形题,这些变形方式也是在耗子叔的博客上看的,题目如下:

其它相关的变种题如下: 通过修改、增加一个字符,让其输出21个减号 通过修改、增加一个字符,让其只输出1个减号 通过修改、增加一个字符,让其不输出减号 https://coolshell.cn/articles/3961.html

花了点时间试了试,还是搞出来了。不过时间也花得不短,超过十五分钟了。

这里给一下我的答案:

1.添加一个字符输出 21 个减号,代码如下:

代码语言:javascript复制
int n = 20;

for (int i = 0; ~i < n; i --) {
    printf("-");
}

这里,对变量 i 进行了取反操作。

2.添加一个字符输出 1 个减号,代码如下:

代码语言:javascript复制
int n = 20;

for (int i = 0; i < &n; i --) {
    printf("-");
}

这里,对 n 进行了取地址运算。

3.修改一个字符,让其不输出减号,代码如下:

代码语言:javascript复制
int n = -20;

for (int i = 0; i < n; i --) {
    printf("-");
}

这里,将变量 n 初始化为了 -20。

上面的问题中,不输出减号的方式还是很容易找到多种方法的,但是输出 1 个减号和输出 21 个减号,要找到多种方法感觉比较复杂。而且,不同的语言解决起来方法不太一样,就比如输出 1 个减号,在 C 语言中我使用的是取地址运算,而其他语言就不行了,比如 Java、PHP 和 Python 就没有这个运算符了吧。我用 PHP 实现了下只输出一个 1 个减号,代码如下:

代码语言:javascript复制
$n = 2>0;

for ($i = 0; $i < $n; $i --) {
    print '-';
}

上面的代码中,我将 20 改成了 2>0 ,添加了一个符号。我真是觉得自己小时候的脑筋急转弯没白玩啊。

0x04 - 最后……

中规中矩的写代码挺好的,本来就很难写出优雅的代码,要是每天就想着写这种代码,也真的就是没谁了。好好写代码,面试、工作不是参加代码混乱大赛!!

0 人点赞