java 程序员面试金典 1

时间:2021-12-22 00:41:07
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;
}