剑指 Offer 64. 求1+2+…+n
题目
代码
class Solution {
public:
int res = 0;
int sumNums(int n) {
//使用逻辑运算符构造短路效应,如果n小于1则不执行sumNums(n - 1)
bool x = n > 1 && sumNums(n - 1) > 0;
res += n;
return res;
}
};
剑指 Offer 65. 不用加减乘除做加法
题目
代码
class Solution {
public:
int add(int a, int b) {
//使用位运算处理进位等
//进位为0
if(b == 0) {
return a;
}
//负数左移有问题,需要加一个(unsigned int)
return add(a ^ b, (unsigned int)(a & b) << 1);
}
};
剑指 Offer 66. 构建乘积数组
题目
代码
方法一:记录左右乘积
时间和空间复杂度较高
class Solution {
public:
vector<int> constructArr(vector<int>& a) {
int n = a.size();
//记录i的左边乘积
vector<int>Bl(n, 1);
//记录i的右边乘积
vector<int>Br(n, 1);
vector<int>B(n, 1);
//前缀
for(int i = 1; i < n; i++) {
Bl[i] = Bl[i - 1] * a[i - 1];
}
//后缀
for(int i = n - 2; i >= 0; i--) {
Br[i] = Br[i + 1] * a[i + 1];
}
for(int i = 0; i < n; i++) {
B[i] = Bl[i] * Br[i];
}
return B;
}
};
方法二:改进方法一
直接使用b[i],不使用额外的空间
class Solution {
public:
vector<int> constructArr(vector<int>& a) {
int len = a.size();
if(len == 0) return {};
vector<int> b(len, 1);
b[0] = 1;
int tmp = 1;
//记录i的左边乘积
for(int i = 1; i < len; i++) {
b[i] = b[i - 1] * a[i - 1];
}
//记录i的右边乘积
for(int i = len - 2; i >= 0; i--) {
tmp *= a[i + 1];
b[i] *= tmp;
}
return b;
}
};