Skip to content

面试速答(先看这里)

**一句话结论:**可以用其他方法来判断两个正整数的大小,而不使用大于号(>)和小于号(<)。

60秒标准回答:

可以用其他方法来判断两个正整数的大小,而不使用大于号(>)和小于号(<)。以下是几种方法

使用减法: 这个是最容易想到的办法了,通过减法的结果是否大于0,可以判断两个数的大小

但是这个方案显然不能让面试官满意,那么还有一种用加法的方案

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**使用减法: 这个是最容易想到的办法了,通过减法的结果是否大于0,可以判断两个数的大小。
  • **要点2:**但是这个方案显然不能让面试官满意,那么还有一种用加法的方案,
  • **要点3:**这个办法是想一想还是可以想到的,类似的还可以用取模、除法等其他数学运算来实现。
  • **要点4:**睡眠排序是一种基于延迟的方法来排序数值的排序算法。
  • **要点5:**但是需要注意的是,睡眠排序在实际应用中不是高效的,因为它的时间复杂度依赖于最大值的大小,而且不适合处理非常大的数值或要求高精度的场景。

**记忆锚点:**diff → 创建多个线程 → 睡眠排序(Sleep Sort) → 来排序数值的排序算法 → 序的整数创建一个线程 → 以下是几种方法

关键取舍:

  • 但是需要注意的是,睡眠排序在实际应用中不是高效的,因为它的时间复杂度依赖于最大值的大小,而且不适合处理非常大的数值或要求高精度的场景。

易错提醒:

  • 以下是几种方法: 使用减法: 这个是最容易想到的办法了,通过减法的结果是否大于0,可以判断两个数的大小。
  • 但是这个方案显然不能让面试官满意,那么还有一种用加法的方案, 使用加法: 因为说了 (a) 和 (b) 是两个正整数,你可以比较它们的和和其中一个数的两倍: 如果 ( a + b > 2a ) ,则 ( b > a ) 。

加分表达:

  • 如果 ( a - b > 0 ) ,则 ( a > b ) 。
  • 如果 ( b - a > 0 ) ,则 ( b > a ) 。
  • 如果 (a - b = 0),则 (a = b)。

追问准备:

  • 围绕「diff」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「创建多个线程」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「睡眠排序(Sleep Sort)」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

可以用其他方法来判断两个正整数的大小,而不使用大于号(>)和小于号(<)。以下是几种方法:

使用减法:
这个是最容易想到的办法了,通过减法的结果是否大于0,可以判断两个数的大小。

  • 如果 (a - b > 0),则 (a > b)。
  • 如果 (b - a > 0),则 (b > a)。
  • 如果 (a - b = 0),则 (a = b)。

但是这个方案显然不能让面试官满意,那么还有一种用加法的方案,

使用加法:
因为说了 (a) 和 (b) 是两个正整数,你可以比较它们的和和其中一个数的两倍:

  • 如果 (a + b > 2a),则 (b > a)。
  • 如果 (a + b > 2b),则 (a > b)。
  • 如果 (a + b = 2a),则 (b = a)。

这个办法是想一想还是可以想到的,类似的还可以用取模、除法等其他数学运算来实现。

使用位运算

还有一种办法,那就是利用差值的符号位来判断两个数的大小关系。基本思路是计算两个数的差值,然后通过分析差值的符号位来确定两个数的大小。

  • 计算差值 diff = a - b。

  • 通过差值的符号位来判断:

  • 如果 diff 为正,则 a > b。

  • 如果 diff 为负,则 b > a。

  • 如果 diff 为零,则 a == b。

plain
public class CompareUsingBitwise {
    public static String compare(int a, int b) {
        int diff = a - b;
        
        // 获取符号位
        int sign = (diff >> 31) & 1;
        
        // 处理符号位
        if (sign == 0) {
            if (diff == 0) {
                return "a == b";
            } else {
                return "a > b";
            }
        } else {
            return "b > a";
        }
    }

    public static void main(String[] args) {
        System.out.println(compare(5, 3));  // 输出: "a > b"
        System.out.println(compare(3, 5));  // 输出: "b > a"
        System.out.println(compare(5, 5));  // 输出: "a == b"
    }
}
  • diff >> 31 右移 31 位,将差值的符号位移到最低位(最右边),这样可以得到符号位。
  • & 1 用来提取符号位。符号位为 0 表示 diff 为非负(即 a >= b),为 1 表示 diff 为负(即 a < b)。
  • 如果 diff 为 0,说明 a 和 b 相等。

如果面试官还是不满意,那么也可以回答以下方法(并不常见,纯属是硬要回答。。。):

睡眠排序(Sleep Sort)

睡眠排序是一种基于延迟的方法来排序数值的排序算法。它利用了程序的睡眠(sleep)函数来“等待”特定的时间,从而实现排序。具体步骤如下:

创建多个线程:为每个待排序的整数创建一个线程。

线程延迟:每个线程根据待排序整数的值睡眠相应的时间(例如,整数值为 x 的线程睡眠 x 秒)。

线程打印:当线程完成睡眠后,打印该整数。

但是需要注意的是,睡眠排序在实际应用中不是高效的,因为它的时间复杂度依赖于最大值的大小,而且不适合处理非常大的数值或要求高精度的场景。

(这个方式挺逗比的,是我看到一个面经中面试官说可用这种方式的,这就很难评。。。。。。不建议大家提这个方案,如果面试官一定要刨根问底的追问更多方案,可以提一下。)