✅不用大于号小于号怎么判断两个正整数大小?

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

使用减法:
这个是最容易想到的办法了,通过减法的结果是否大于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
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,说明 ab 相等。

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

睡眠排序(Sleep Sort)


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

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

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

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

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

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

原文: https://www.yuque.com/hollis666/xkm7k3/sthvwqeiyr4f10gq