1、不用比较符号返回较大的数
/**
* 不用比较符号返回较大的数:
* sign():
* +、0:1
* -:0
*
* 思路1:
* 比较a-b的符号为正或父,当产生溢出时,不能判别
*
* 思路2:
* 先比较两个数的符号:
* 1、符号不同,直接返回符号为正的那个数。
* 2、符号相同a-b的值绝对不会溢出,那么就看c的符号。
* c=a-b,为正返回a;
* c=a-b,为负返回b;
*/
public static int getMax1(int a,int b){
int c=a-b;
return sign(c)==0?a:b;
}
public static int getMax2(int a,int b){
if(sign(a)!=sign(b)){
return sign(a)==0?a:b;
}else{
return getMax1(a, b);
}
}
private static int sign(int c){
return c>>31;
}
2、三个数找出第二大数
假设:
a<b<c
b为第二大时:
a-b<0
b-c<0
c为第二大时:
a-c<0
c-b<0
否则a为第二大
public int getMid(){
if((a-b)*(b-a)>0){
return b;
}else if((a-c)*(c-b)){
return c;
}else{
return a;
}
}
3、二进制
3.1 出现一次的数字
func singleNumber(nums []int) int {
// 10 ^10 == 00
// 两个数异或就变成0
result = 0
for(i=0; i<nums.length() ;i++){
result = result^nums[i]
}
return result
}
3.2 数字对应二进制中1的个数
func hammingWeight(num uint32) int {
res:=0
for num!=0{
num=num&(num-1)
res++
}
return res
}