1、不用加减乘除做加法
//写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
//
//
//
// 示例:
//
// 输入: a = 1, b = 1
//输出: 2
//
//
//
// 提示:
//
//
// a, b 均可能是负数或 0
// 结果不会溢出 32 位整数
//
// Related Topics 位运算 数学
不用加减乘除做加法,直接采用本位加进位的方式进行,按位进行异再左移一位就能得到进位,按位相与就能得到本位,然后相加,直到最后进位为0.
public int add(int a, int b) {
while(b != 0){
int c = (a&b)<<1;
a ^= b;
b=c;
}
return a;
}
2、队列的最大值
采用双向队列来实现队列的最大值,首先还是采用队列来存储这些个数据,额外再实现一个双向队列,双向队列需要保持单调,首大尾小,因为当我们加一个新的数到队列中的时候,如果单调队列中前面的数小于当前数,那这是对它本身没有影响的,只有比它大的数才有影响,所以当我们添加进一个数到单调队列中的时候,我们需要将比它小的数全部出队列,再将其添加进去。
方法一:暴力法
暴力法构造了一个数组,用于求数组中最大的值是多少
class MaxQueue {
//采用数组的方式
int[] q = new int[20000];
int begin = 0, end = 0;
public MaxQueue() {
}
public int max_value() {
int ans = -1;
for (int i = begin; i != end; i++) {
ans = Math.max(ans, q[i]);
}
return ans;
}
public void push_back(int value) {
q[end++] = value;