位运算:
难度简单65收藏分享切换为英文接收动态反馈
设计一个函数把两个数字相加。不得使用 + 或者其他算术运算符。
示例:
输入: a = 1, b = 1 输出: 2
java和c++版:
class Solution {
public int add(int a, int b) {
if(b==0){
return a;
}
int c=a^b;
int d=(a&b)<<1;
return add(c,d);
}
}
class Solution {
public:
int add(int a, int b) {
if (b == 0) { // b=0也就是进位c=0,因此结果为非进位和n,也就是a
return a;
}
return add(a ^ b, static_cast<unsigned int>(a & b) << 1); // n=a^b,c= (a & b) << 1; 将a=n,b=c 继续递归 (注: leetcode不支持负值左移,需要强制转换(a&b)为无符号数)
}
};
学习收获:位运算。
”^“异或符表示相同位为0,不同位为1;"<<"">>"左右移位,如”<<1“将0101左移一位得到01010;
a^b将0+0=0,1+0=1,0+1=1,1+1=0;当a&b=1时,则1+1=0,左移位1,表进位,直到b为0为止表再无进位,则a为最终结果。
总结:当不使用算术运算符时应想到用位运算解决。
-------------------------------------------------------------------------------------------------------------------------------
难度中等58收藏分享切换为英文接收动态反馈
递归乘法。 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些。
示例1:
输入:A = 1, B = 10 输出:10
示例2:
输入:A = 3, B = 4 输出:12
提示:
保证乘法范围不会溢出
class Solution {
public int multiply(int A, int B) {
if(A<B)
{
return multiply(B,A);
}
if(B==1)return A;
if(B%2==0)
{
return multiply(A,B>>1)<<1;
}
else
{
return (multiply(A,B>>1)<<1)+A;
}
}
}
题目解析:运用位运算,将B设为较小的数,当B为偶数,则对半计算,若为奇数,则对半计算+A*1;
为什么选取B取2余数为if循环条件?
B值较小,实现的递归次数更少。
再说说multiply(A,B>>1)<<1的含义,递归到底,则B最高位为1,1*A为A,递归的次数则为B右移位的位数。
-------------------------------------------------------------------------------------------------------------------------------
难度中等847收藏分享切换为英文接收动态反馈
给定两个整数,被除数 dividend
和除数 divisor
。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend
除以除数 divisor
得到的商。
整数除法的结果应当截去(truncate
)其小数部分,例如:truncate(8.345) = 8
以及 truncate(-2.7335) = -2
示例 1:
输入: dividend = 10, divisor = 3 输出: 3 解释: 10/3 = truncate(3.33333..) = truncate(3) = 3
示例 2:
输入: dividend = 7, divisor = -3 输出: -2 解释: 7/-3 = truncate(-2.33333..) = -2
提示:
- 被除数和除数均为 32 位有符号整数。
- 除数不为 0。
- 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。本题中,如果除法结果溢出,则返回 231 − 1。
(问题未解决)
-------------------------------------------------------------------------------------------------------------------------------
难度中等883
实现 pow(x, n) ,即计算 x
的 n
次幂函数(即,xn
)。
示例 1:
输入:x = 2.00000, n = 10 输出:1024.00000
示例 2:
输入:x = 2.10000, n = 3 输出:9.26100
示例 3:
输入:x = 2.00000, n = -2 输出:0.25000 解释:2-2 = 1/22 = 1/4 = 0.25
提示:
-100.0 < x < 100.0
-231 <= n <= 231-1
-104 <= xn <= 104
class Solution {
public double myPow(double x, int n) {
if (n == 0){
return 1;
}
if (n == 1 || x == 1.0){
return x;
}
if (n < 0){
return 1 / x * myPow(1 / x, -(n + 1));
}
int a = n / 2;
int b = n % 2;
return b == 0 ? myPow(x * x, a) : x * myPow(x * x, a);
}
}