这是一个源自知乎的话题,原贴链接:一道百度的面试题,有大神会嘛?

虽然我不是大神,但我也点进去看了一下,思考了一会之后有了一些思路,然后去看其它人的答案的时候果然全都已经被各路大神们先想到并贴出来了,所以我就不去凑热闹写重复答案了,整理一下网友们的智慧在这里自娱自乐好了。

题目

思路一

作为一个多年前也见过不少笔试题的少年,看到这个题目的第一想法是脑筋急转弯——注入一段逻辑直接改变原 if 结构。

解法一

填入内容 true){System.out.print("a");}if(false

public void print() {
if (true) {
System.out.print("a");
} if (false) {
System.out.print("a");
} else {
System.out.print("b");
}
}

类似地也可以填入 true){System.out.print("ab");return;}if(false 等。

当初大学时单纯的少年可是很难想出这样的套路的,时间改变了我们啊。

思路二

如果正经遵从题目的原代码结构,那就得想办法构造一段代码,既能输出 a,又能返回 false

解法二

我也想到能否使用 System.out.print 的返回值来做文章,但奈何并不记得它返回什么,首先让我们复习一下 PrintStream 的 printprintln和 printf 方法的区别:

方法 功能 返回值
print 打印一个值或者对象 void
println 打印并换行 void
printf 格式化打印 PrintStream

所以适用的是 printf,它的返回值是 PrintStream 类型的 System.out,判它是否为空即可。

填入内容 System.out.printf("a") == null

public void print() {
if (System.out.printf("a") == null) {
System.out.print("a");
} else {
System.out.print("b");
}
}

经测试填入 System.out.append("a") == null 也是可以达到效果的。

解法三

仍然是思路二,但从匿名内部类来作文章。

实现代码:

public void print() {
if (new Object() {
boolean print() {
System.out.print("a");
return false;
}
}.print()) {
System.out.print("a");
} else {
System.out.print("b");
}
}

这里利用的知识点是匿名内部类可以声明基类没有的新方法并且马上调用。

解法四

使用 Java 8 里的 lambda 来实现思路二。

public void print() {
if (((BooleanSupplier)(() -> {System.out.print("a");return false;})).getAsBoolean()) {
System.out.print("a");
} else {
System.out.print("b");
}
}

严格来讲这个不一定能算作正确答案,因为要增加 import java.util.function.BooleanSupplier;

脑洞大开

讲完严肃的解法,来看看网友 穷小子 开脑洞的思路:

public void print() {
// if ( ) {
System.out.print("a");
// } else {
System.out.print("b");
// }
}

如果没有特意说明只能在括号里加东西,倒真是个妙计!

同样看得我一愣一愣的还有 caiwei 同学的答案,他和朋友们发现题目里少写了个大括号(真的),于是我们看到他的朋友老方的解决方案:

真是防不胜防啊~不过我喜欢!

一道在知乎很火的 Java 题——如何输出 ab【转】的更多相关文章

  1. 很火的Java题——判断一个整数是否是奇数

    完成以下代码,判断一个整数是否是奇数: public boolean isOdd(int i) 看过<编程珠玑>的人都知道这道题的答案和其中极为简单的道理. 最普遍的风格,如下: 这个函数 ...

  2. 每天一道Java题[3]

    问题 为什么在重写equals()方法的同时,必须重写hashCode()方法? 解答 在<每天一道Java题[2]>中,已经对hashCode()能否判断两个对象是否相等做出了解释.eq ...

  3. 每天一道Java题[11]

    题目 synchronized怎么实现线程同步?请修改<每天一道Java题[10]>中的MyRunnableThread类以解决三个线程都获取到10的问题. 解答 方法一: 采用synch ...

  4. 一道很经典的 BFS 题

    一道很经典的 BFS 题 想认真的写篇题解. 题目来自:https://www.luogu.org/problemnew/show/P1126 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运 ...

  5. Java知多少(5) Java开发环境的搭建

    要进行Java开发,首先要安装JDK(Java Development Kit,Java开发工具箱). JDK 是一系列工具的集合,这些工具是编译Java源码.运行Java程序所必需的,例如JVM.基 ...

  6. Java知多少(50)Java throws子句

    如果一个方法可以导致一个异常但不处理它,它必须指定这种行为以使方法的调用者可以保护它们自己而不发生异常.做到这点你可以在方法声明中包含一个throws子句.一个 throws 子句列举了一个方法可能抛 ...

  7. Java知多少(78)Java向量(Vector)及其应用

    Vector(向量)是 java.util 包中的一个类,该类实现了类似动态数组的功能. 向量和数组相似,都可以保存一组数据(数据列表).但是数组的大小是固定的,一旦指定,就不能改变,而向量却提供了一 ...

  8. 安利一个很火的 Github 滤镜项目

    安利一个很火的 Github 滤镜项目 园长 1 个月前 简评:通过深度学习,一秒钟让你的照片高大上,这是康奈尔大学和 Adobe 的工程师合作的一个新项目,通过卷积神经网络把图片进行风格迁移.项目已 ...

  9. wpf 模拟抖音很火的罗盘时钟,附源码,下载就能跑

    wpf 模拟抖音很火的罗盘时钟,附源码 前端时间突然发现,抖音火了个壁纸,就是黑底蕾丝~~~  错错错,黑底白字的罗盘时钟! 作为程序员的我,也觉得很新颖,所以想空了研究下,这不,空下来了就用wpf, ...

随机推荐

  1. Title of live Writer

    Test From Windows Live Writer **markdown bold**

  2. bzoj2734: [HNOI2012]集合选数

    Description <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中 ...

  3. Javascript系列之js简介

    JavaScript是一种网络客户端脚本语言,javascript有三个组成部分: 1)核心(ECMAScript)---描述了语言的基本语法和对象 2)文档对象模型(DOM)---描述了处理网页内容 ...

  4. github+Hexo快速搭建个人博客

    注意 本文主要针对Windows平台和Hexo 3.x 准备工作 下载Git [下载地址] [Git官网](https://git-scm.com/download/) 下载Node.js [下载地址 ...

  5. Web工程软件升级之数据库升级(一)

    1. 首先检查oracle数据库版本是否正确 (可以使用方法 lsinventory来实现) 2. 检查oracle连接是否成功 3. 解压升级包,放到特定目录 4. 做升级前数据备份,备份主要业务数 ...

  6. .net 开发框架

    .NET开发人员值得关注的七个开源项目 2010年07月02日09:33 it168网站原创 作者:黄永兵 编译 编辑:胡铭娅 我要评论(0) [IT168技术分析]微软近几年在.NET社区开源项目方 ...

  7. HDOJ迷宫城堡(判断强连通 tarjan算法)

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...

  8. HDOJ(HDU) 2143 box(简单的多次判断-用的卫条件)

    Problem Description One day, winnie received a box and a letter. In the letter, there are three inte ...

  9. flex与C# Socket通信

    原文地址:http://blog.csdn.net/LX10752p/archive/2011/04/27/6366526.aspx Socket 通信没什么好说,一个服务端,多个客户端,很容易搭建环 ...

  10. linux运维社区站点收集

    1, 新世纪linux社区 offical locator: http://www.21ops.com/industry-news/24370.html 2,