给 n
个非负整数,请你求出最大或和,最小或和,最大与和,最小与和这四个数之和。
样例
例1:
输入:
n = 3
nums = [1, 2, 3]
输出:
7
解释:
最大或和:3,最小或和:1,最大与和:3,最小与和:0。
答案:3 + 1 + 3 + 0 = 7。
例2:
输入:
n = 3
nums = [0, 0, 1]
输出:
2
解释:
最大或和:1,最小或和:0,最大与和:1,最小与和:0。
答案:1 + 0 + 1 + 0 = 2。
例3:
输入:
n = 5
nums = [12313, 156, 4564, 212, 12]
输出:
25090
解释:
最大或和:12765,最小或和:12,最大与和:12313,最小与和:0。
答案:12765 + 12 + 12313 = 25090。
例4:
输入:
n = 3
nums = [111111, 333333, 555555]
输出:
1588322
解释:
最大或和:917047,最小或和:111111,最大与和:555555,最小与和:4609。
答案:917047+ 111111+ 555555+ 4609 = 1588322。
注意事项
- 最大或和为在 n 个数中,任取若干个数(不能不取),进行或运算后最大的数。
- 最小或和为在 n 个数中,任取若干个数(不能不取),进行或运算后最小的数。
- 最大与和为在 n 个数中,任取若干个数(不能不取),进行与运算后最大的数。
- 最小与和为在 n 个数中,任取若干个数(不能不取),进行与运算后最小的数。
1 <= n <= 1000000
,0 <= nums[i] <= 2^32 - 1
。
最大或和:所有数或起来。
最小或和:最小数。
最大与和:最大数。
最小与和:所有数与起来。
最后将最大或和,最小或和,最大与和,最小与和,注意答案范围可能超过 int。
class Solution {
public:
/**
* @param n:
* @param nums:
* @return: return the sum of maximum OR sum, minimum OR sum, maximum AND sum, minimum AND sum.
*/
long long getSum(int n, vector<int> &nums) {
// write your code here
int maxOrSum = nums[0], maxAndSum = nums[0];
int minOrSum = nums[0], minAndSum = nums[0];
for (int i = 1; i < n; i++) {
maxOrSum |= nums[i];
maxAndSum = max(maxAndSum, nums[i]);
minOrSum = min(minOrSum, nums[i]);
minAndSum &= nums[i];
}
return (long long)maxOrSum + maxAndSum + minOrSum + minAndSum;
}
};