java 程序员面试金典 1

1.请编写一个方法,找出两个数字中最大的那个。条件是不得使用if-else等比较和判断运算符。
给定两个int a和b,请返回较大的一个数。若两数相同则返回任意一个。


public int getMax(int a,int b){
  int c=(a-b)>>31;
  return a+c*(a-b);
}

/* c=(a-b)>>31;
当a>=b :(a-b)符号位 为0 ,右移31位(int型),高位补0 ,右移后的结果为0
当a<b: 符号位是1 ,右移31位,高位补1,右移后的结果是-1 ,不是1
a+c*(a-b):
当c=0 :a>=b, 返回a
当c=-1 :a<b ,返回 a-(a-b)=b .


2 .请编写一个函数,函数内不使用任何临时变量,直接交换两个数的值。

给定一个int数组AB,其第零个元素和第一个元素为待交换的值,请返回交换后的数组。

public int [] exchageAB(int [] AB){
   AB[0]=AB[0]^AB[1];
   AB[1]=AB[0]^AB[1];
   AB[0]=AB[0]^AB[1];
   return AB;
}
/ *
如果采用位运算来交换两个元素,则最可能使用的是位异或运算。
如果是位与,一个数的0就会覆盖掉另一个数的0或者1,信息丢失。
如果是位或,一个数的1就会覆盖掉另一个数的0或者1.
而采用位异或,1表明两个位置不同,0表示相同。
*/

public class Exchange {
  public int[] exchangeAB(int[] AB) {
    AB[0] = AB[1] - AB[0];
    AB[1] = AB[1] - AB[0];
    AB[0] = AB[1] + AB[0];
    return AB;
}
//有可能相加运算产生溢出情形,所以最好采用异或方法。

3. 实现一个算法,删除单向链表中间的某个结点,假定你只能访问该结点。
给定带删除的节点,请执行删除操作,若该节点为尾节点,返回false,否则返回true


public boolean removeNode(ListNode pNode){
   if(pNode==null || pNode.next==null)
       return false;
   pNode.val=pNode.next.val;
   pNode.next=pNode.next.next;
   return true;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值