看到一个面试题,大家来讨论下!
原帖见:今天去迅雷面试了,非常不爽
题目是:不用比较运算符,判断int型的a,b两数的大小。
我当时想到的,就是a-b然后判断最高位是1还是0,但是最后发现如果a=-2147483648,b=2147483647时,作为int型的数相减就越界了,并且符号位丢失了。其实不用那么极端的例子,因为两个不同符号的数,相减很容易越界。所以我在之前先判断a和b的符号位。于是就有了下面的代码:
- Java code
System.out.println((((a >>> 31 == 0) && (b >>> 31 == 1))|(((a >>> 31)^(b >>> 31))==0)&&(((a-b)>>>31)==0))?"a>=b":"a<b");//同符号的相减;异号时a为正,则a>=b。
当然了,也可以32位逐位比较。我想听听大家的好意见。
- 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]); }} [解决办法]
不用比较运算符, 就是说==号也不能用
(a >>> 31 == 0)
这里用到了等号
所以答案错误。只要是用到了if之类的,则必然要 true/false, 则必然涉及到比较运算符。
思考中...
[解决办法]
不会啊 接分吧
[解决办法]
不会 学习
[解决办法]
[解决办法]
可以用接口comparable来实现,只要实现它的方法compareTo()方法即可原理可以参考此接口的使用,我写了个例子,可以参考一下,结果是正确的。
- Java code
public class Test1 implements Comparable<Integer>{ private int a; public Test1(){ } public Test1(int c){ this.a=c; } public int getA() { return a; } public void setA(int a) { this.a = a; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int i=new Test1(-2147483648).compareTo(2147483647); if(i>0){ System.out.println("a>b"); }else if(i<0){ System.out.println("a<b"); }else{ System.out.println("a=b"); } } public int compareTo(Integer i) { // TODO Auto-generated method stub if(a<i) return -1; if(a>i) return 1; return 0; } }
[解决办法]
我们方法是重写compareTo方法而已,很简单。
[解决办法]
成就啊!---变态的问题解决了 一个> < ==都没有用到
判断的时候建议用下正则---为了速度我用了equals判断
public static void main(String[] args) {
compareTwoInt(23, -45);
}
public static void compareTwoInt(int a, int b){
int c = 0;
//此处最好采用正则表达来判断a b 的类型0 ,正,负;为了方便我就将就下了,-我也采用了equalsji
//建议用正则表达
if(String.valueOf(a).equals("0")&&String.valueOf(b).equals("0")){
System.out.println("a等于b");
}
if(!String.valueOf(a).equals("0")&&String.valueOf(b).equals("0")){
if(String.valueOf(a).contains("-")){
System.out.println("a小于b");
}
System.out.println("a大于b");
}
//b不等于0
if(!String.valueOf(b).equals("0")){
c = a/b;
switch (c) {
case 0:
//a,b 都为正
if(!String.valueOf(a).contains("-")&&!String.valueOf(b).contains("-")){
System.out.println("a小于b");
}
//a 为负,b为负
if(String.valueOf(a).contains("-")&&String.valueOf(b).contains("-")){
System.out.println("a大于b");
}
//a 为负,b为正
if(String.valueOf(a).contains("-")&&!String.valueOf(b).contains("-")){
System.out.println("a小于b");
}
//b 为负,a为正
if(!String.valueOf(a).contains("-")&&String.valueOf(b).contains("-")){
System.out.println("a大于b");
}
break;
case 1:
//a/b=1的情况有a>b(a/b=1.32...)存在
//a 为负,b为正
if(String.valueOf(a).contains("-")&&!String.valueOf(b).contains("-")){
System.out.println("a小于b");
}
//b 为负,a为正
if(!String.valueOf(a).contains("-")&&String.valueOf(b).contains("-")){
System.out.println("a大于b");
}
if(String.valueOf(a).equals(String.valueOf(b))){
System.out.println("a等于b");
}
else{
System.out.println("a大于b");
}
break;
default:
//a 为负,b为负
if(String.valueOf(a).contains("-")&&String.valueOf(b).contains("-")){
System.out.println("a小于b");
}
//a 为负,b为正
if(String.valueOf(a).contains("-")&&!String.valueOf(b).contains("-")){
System.out.println("a小于b");
}
//b 为负,a为正
if(!String.valueOf(a).contains("-")&&String.valueOf(b).contains("-")){
System.out.println("a大于b");
}
else{
System.out.println("a大于b");
}
}
}
}
[解决办法]
变态题目!直接来个true/false算了
[解决办法]
int max(int a, int b) {
return a+b;
}
不过感觉还是会有像LZ说的越界问题
[解决办法]
mark!!~~
[解决办法]
顶起来
[解决办法]
[解决办法]
- Java code
用异常应该可以如下:(效率可能很低,不过觉得结果还是可以的)public class Test{ public static void main(String[] args) { int a=1,b=2; Test test=new Test(); test.my_Compare(a,b); } public void my_Compare(int a,int b) { int aa=10,bb=10; while(true) { try { a=a++; aa=aa/a; System.out.println("a="+a); } catch(Exception e) { System.out.println("a 大"); System.exit(0); } try { b=b++; bb=bb/b; System.out.println("b="+b); } catch(Exception e) { System.out.println("b 大"); System.exit(0); } } }}
[解决办法]
基于大家的讨论,我提出个方法
- Java code
boolean[] judge = {true,false}; if(judge[-(int) (((long)a-(long)b)>>63)]) System.out.println("a is the bigger one");else System.out.println("b is the bigger one");
[解决办法]
b==0?(a>0?1:0):(b>0?a/b:b/a)
[解决办法]
public void compare(Integer x,Integer y){
String [][]buf={{"=","="},{">","<"}};
int id1=((x-y)^(y-x))>>31;
id1=id1*id1;
int id2=(x/2-y/2)>>>31;
System.out.println(x+buf[id1][id2]+y);
}
这个应该可以吧~~
[解决办法]
?????怎么没出来呢??
在发一遍
public void compare(Integer x,Integer y){
String [][]buf={{"=","="},{">","<"}};
int id1=((x-y)^(y-x))>>31;
id1=id1*id1;
int id2=(x/2-y/2)>>>31;
System.out.println(x+buf[id1][id2]+y);
}
可以的话要给分啊,呵呵~
[解决办法]
max(a,b)=(a+b+abs(a-b))/2
min(a,b)=(a+b-abs(a-b))/2
[解决办法]
小弟想了个方法,不知道对不对,请纠正
1判断a和b是否相等if(a==b) 结束;else 进入2中;
2判断a和b的符号是否相同?
if((a^b)>>31) System.out.print("a和b是同号的");
else a和b异号
3当 a和b异号 的时候
if(a>>31) System.out.print("a大于b");
else System.out.print("b大于a");
4当 a和b同号的时候
(1).if(a>>31) System.out.print("a和b是非负的");
int c=a-a&b;
int d=b-a&b;
for(int k=1;k<=32;k++)
{
if(c>>k) {System.out.print("a大于b");break;}
if(d>>k) {System.out.print("b大于a");break;}
}
(2).else
{
int x=~a;
int y=~b;
调用 4(1),当x大于y,a小于b,当y大于x时,a大于b;
}
[解决办法]
能解决问题还要简单的,就是答案了,丫迅雷好雷人的题目!
[解决办法]
//这个方法,x是0的情况不能处理,希望高手解决
int max(int x, int y){
int[] buf = {x, y};
return buf[y/x];
}
[解决办法]
菜鸟路过,期待达人
[解决办法]
判断(long)a - b行不
[解决办法]
int[] intArray = new int[2] ;
intArray[0] = a ;
intArray[1] = b ;
int index = (a - b) >>> 31 ;
intArray[index] 就是那个最大的值
[解决办法]
[解决办法]
int a=2,b=3;
a = a-b;
a = a>>31;
if(a)
printf("a<b \n");
else
printf("a>=b\n");
------解决方案--------------------
[解决办法]
7 int main()
8 {
9 int a=2, b=3;
10 int c;
11
12 c = a-b;
13 c = c>>31;
14 if(c)
15 printf("a<b \n");
16 else{
17 c = b-a;
18 c = c>>31;
19 if(c)
20 printf("a>b\n");
21 else
22 printf("a==b\n");
23 }
24
25 return 0;
26 }
[解决办法]
[解决办法]
c++实现
/*
返回值:
>0 x > y
0 x == y
<0 x < y
*/
int compare(int x, int y)
{
int tmp = x - y;
if ( (x >> 31) ^ (y >> 31))
{
if ((x >> 31) ^ (tmp >> 31))
{
return ~tmp;
}
else
{
return tmp;
}
}
else
{
return tmp;
}
}
[解决办法]
雷人 我想到的解决方法是复杂的菜鸟在这里学习了
ding
http://heisetoufa.javaeye.com/blog/227687
- Java code
public static void main(String[] args) { compareTwoInt(0, 0); compareTwoInt(-12, -11); compareTwoInt(-12, 0); compareTwoInt(0, 0); compareTwoInt(2, 2); compareTwoInt(-12, -12); compareTwoInt(-2, 3); compareTwoInt(3, -3); compareTwoInt(3, -2); compare(1,0); } /** * 判断正负 true>0 * * @param a * @return */ public static boolean parserInt(int a) { switch (a >>> 31) { case 0: return true; case 1: return false; default: return false; } } /** * 判断是否为0 * * @param a * */ public static boolean parserIntZero(int a) { switch (a) { case 0: return true; default: return false; } } public static void compareTwoInt(int a, int b) { int c = 0; // 此处最好采用正则表达来判断a b 的类型0 ,正,负;为了方便我就将就下了,-我也采用了equalsji // 建议用正则表达 if (parserIntZero(a) && parserIntZero(b)) { System.out.println("a等于b"); } if (!parserIntZero(a) && parserIntZero(b)) { if (!parserInt(a)) { System.out.println("a小于b"); }else{ System.out.println("a大于b"); } } // b不等于0 if (!parserIntZero(b)) { c=a/b; switch (c) { case 0: // a,b 都为正 if (parserInt(a) && parserInt(b)) { System.out.println("a小于b"); } // a 为负,b为负 if (!parserInt(a) && !parserInt(b)) { System.out.println("a大于b"); } // a 为负,b为正 if (!parserInt(a) && parserInt(b)) { System.out.println("a小于b"); } // b 为负,a为正 if (parserInt(a) && !parserInt(b)) { System.out.println("a大于b"); } break; case 1: // a 为负,b为正 if (!parserInt(a) && parserInt(b)) { System.out.println("a小于b"); } // b 为负,a为正 if (parserInt(a) && !parserInt(b)) { System.out.println("a大于b"); } // a/b=1的情况有a>b(a/b=1.32...)存在 else { // 获得余数 int m = a % b; switch (m) { case 0: System.out.println("a等于b");break; default: // a 为负,b为负 if (!parserInt(a) && !parserInt(b)) { System.out.println("a小于b"); } // a,b 都为正 if (parserInt(a) && parserInt(b)) { System.out.println("a大于b"); } break; } } break; default: // a 为负,b为负 if (!parserInt(a) && !parserInt(b)) { System.out.println("a小于b"); } // a 为负,b为正 if (!parserInt(a) && parserInt(b)) { System.out.println("a小于b"); } // b 为负,a为正 if (parserInt(a) && !parserInt(b)) { System.out.println("a大于b"); } else { System.out.println("a大于b"); } } } }
[解决办法]
18正确吧
[解决办法]
刚看到题目,我也是想用减法,判断有无借位,看样考虑不周,学习学习!
[解决办法]
好,顶!
[解决办法]
帮顶。。。
[解决办法]
顶一下,我觉得77#的tz应该不错,推荐一下,应为位移运算不算比较运算符、……
[解决办法]
看看,学习学习~~~
[解决办法]
我是一个新手学java才半年了我觉的你们都好麻烦哦
把他们放在数组里面一个排序Array.sort不就好了嘛
[解决办法]
顶了
