日期:2014-05-20  浏览次数:20748 次

【答案贴】看到一个面试题,大家来讨论下!
原帖请见:看到一个面试题,大家来讨论下!
因为那个帖子太长了,我结了。这个帖子里主要贴几个典型的解法。

我认为比较好的解法(在Blog里也写了这个方法:不用比较运算符,判断int型的a,b两数的大小)
Java code
public class Bigger {
    public static void main(String args[]){
        int a = -2147483648;
        int b = 2147483647;
        
        String[] strArray = {"a>=b", "a<b"};
                
        int i = (int)((long)a-(long)b >>> 63);
        
        System.out.println(strArray[i]);
    }
}

然后我在回帖中看到了几个很典型的方法(注意:不用比较运算符,不用类库方法。)
Java code
System.out.println(a-b);  //无语,那还不如int a=1; int b=2;直接拿眼睛看算了。

Java code
if(!(a-b)) 
{ 

    if(abs(a-b)-(a-b))  
    { 
        return "a < b"; 
    } 
    else 
    { 
        return "a > b"; 
    } 
} 
else 
{ 
    return "a = b"; 
}//方法很好,数学里整数能到无穷大,但是计算机里不行啊。

Java code
public String compare(Integer x,Integer y){ 
  String [] buf={"=>"," <"}; 
  int id1=(x-y)>>>31;  
  System.out.println(id1); 
  return buf[id1]; 
}//也是没有考虑越界问题


还有些是用接口实现的,有点复杂了。有很多人会问,搞这个东西有什么实际的用途吗?是,确实没什么用,不如直接比较。但是有时候我们中国人就是被这种“有没有用”的功利主义给害了。研究数学,物理和化学有用吗?是没有直接的作用,但是你看看为什么美国,日本,德国的工业和高科技产业如此发达,还不是靠基础科学的投入吗?Google为了提高搜索算法的效率,也是投入巨资。不是什么东西有用没用就能简单的决定你去不去做一件事情,因为你不去做一件事情,就无法知道你在做这件事情的过程中会有什么收获。有一句话说的好:人生是曲折的,但生活是精彩的。



------解决方案--------------------
学习了
------解决方案--------------------
“不是什么东西有用没用就能简单的决定你去不去做一件事情,因为你不去做一件事情,就无法知道你在做这件事情的过程中会有什么收获。”嗯,很同意楼主的观点。我们现在很多同学都抱怨基础课没用,都跑去学流行的语言或快见效果的所谓“新技术”,从而忽视了数据结构与算法、编译原理等基础课的学习。
------解决方案--------------------
不错,算法的效率确实重要!
------解决方案--------------------
引用楼主 justinavril 的帖子:
还有些是用接口实现的,有点复杂了。有很多人会问,搞这个东西有什么实际的用途吗?是,确实没什么用,不如直接比较。但是有时候我们中国人就是被这种“有没有用”的功利主义给害了。研究数学,物理和化学有用吗?是没有直接的作用,但是你看看为什么美国,日本,德国的工业和高科技产业如此发达,还不是靠基础科学的投入吗?Google为了提高搜索算法的效率,也是投入巨资。不是什么东西有用没用就能简单的决定你去不去做一件事情,因为你不去做一件事情,就无法知道你在做这件事情的过程中会有什么收获。有一句话说的好:人生是曲折的,但生活是精彩的。

------解决方案--------------------
好贴!!!!!!!!!
------解决方案--------------------
支持楼主~!
------解决方案--------------------
借鉴楼主的精彩答案,我这里是一个完整版:
Java code
import java.util.Random;

/**
 * 不通过比较运算和类库,比较两个 integer 大小
 */
public class SimpleCompare {

    public static void main(String[] args) {
        Random r = new Random();
        int a = r.nextInt(), b = r.nextInt();
        // int a = 33, b = 33;

        String[] results = {"a < b", "a == b", "a > b"};

        int sum = 1;
        sum = sum - (int)((long)(a - b) >>> 63);
        sum = sum + (int)((long)(b - a) >>> 63);
        System.out.println(a + ", " + b + ": " + results[sum]);
    }
}

------解决方案--------------------
up!!
------解决方案--------------------
好帖子阿..又学习了.!UP
------解决方案--------------------