[CareerCup] 17.4 Maximum of Two Numbers 两数中的较大值

简介:

17.4 Write a method which finds the maximum of two numbers. You should not use if-else or any other comparison operator.

这道题让我们找出两个数中的较大值,不能用if..else..语句判断,也不能用任何比较符号。那么我们怎么办呢,我们看两个数的差值a-b是否大于0,如果大于0,说明a大,如果小于0,说明b大。然后我们用一个变量k来记录a-b的符号位,用q来表示k的相反数,这样当a大的时候,k=1, q=0,反之当b大的时候,k=0,q=1,那么我们只要用a*k + b*q就能得到较大数了:

int flip(int bit) {
    return 1 ^ bit;
}
int sign(int a) {
    return flip((a >> 31) & 0x1);
}
int getMaxNaive(int a, int b) {
    int k = sign(a - b);
    int q = flip(k);
    return a * k + b * q;
}

但是上面的解法有时候会有问题,比如当a=INT_MAX-2, b = -15的时候,a-b就会溢出,那么我们怎么办呢?溢出的情况只会发生在当a是正数,而b是负数的时候,或者反回来的情况,也就是说a和b符号不同。那么我们让k = sign(a),逻辑如下:

当a和b的符号不同,k = sign(a)

否则,k = sign(a - b)

那么我们可以分别保存a,b和a-b的符号,然后我们判断a和b的符号是否相同,如果不相同我们用a的符号,如果相同,我们用a-b的符号,这样我们就可以避免溢出得到正确的k,之后就跟上面的方法完全一样了:

int getMax(int a, int b) {
    int c = a - b;
    int sa = sign(a), sb = sign(b), sc = sign(c);
    int m = sa ^ sb, n = flip(sa ^ sb);
    int k = m * sa + n * sc, q = flip(k);
    return a * k + b * q;
}

本文转自博客园Grandyang的博客,原文链接:两数中的较大值[CareerCup] 17.4 Maximum of Two Numbers ,如需转载请自行联系原博主。

相关文章
|
2月前
PTA-求n个数的最大值、最小值、平均值
求n个数的最大值、最小值、平均值
47 2
|
3月前
leetcode-2006:差的绝对值为 K 的数对数目
leetcode-2006:差的绝对值为 K 的数对数目
47 0
|
2月前
|
人工智能
PTA-求一组数中大于平均值的数的和
求一组数中大于平均值的数的和
15 0
|
2月前
PTA-求n个数的平均值最大值最小值问题
求n个数的平均值最大值最小值问题
24 0
|
6月前
|
程序员
【牛客网】HJ99 自守数、OR86 返回小于 N 的质数个数
目录 HJ99 自守数 OR86 返回小于 N 的质数个数
56 0
|
Python
LeetCode 2006. 差的绝对值为 K 的数对数目
给你一个整数数组 nums 和一个整数 k ,请你返回数对 (i, j) 的数目,满足 i < j 且 |nums[i] - nums[j]| == k 。
78 0
|
存储 算法
力扣-306. 累加数
累加数 是一个字符串,组成它的数字可以形成累加序列。 一个有效的 累加序列 必须 至少 包含 3 个数。除了最开始的两个数以外,序列中的每个后续数字必须是它之前两个数字之和。 给你一个只包含数字 ‘0’-‘9’ 的字符串,编写一个算法来判断给定输入是否是 累加数 。如果是,返回 true ;否则,返回 false 。 说明:累加序列里的数,除数字 0 之外,不会 以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。
53 0
|
算法
利用二分查找获得List中小于并且最接近的数
利用二分查找获得List中小于并且最接近的数
146 0
【PTA】交换最小值和最大值 (15分)
【PTA】交换最小值和最大值 (15分)
1379 0
|
算法 Java C语言
LeetCode刷题2006-简单-差的绝对值为 K 的数对数目
LeetCode刷题2006-简单-差的绝对值为 K 的数对数目
117 0
LeetCode刷题2006-简单-差的绝对值为 K 的数对数目