持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情
1、写在前面
大家好,我是翼同学,这里是【水滴计划 | 刷题日志】
每日两题,拒绝摆烂。
2、内容
2.1、题目一:快乐数
(1) 描述
(2) 举例
(3) 解题
题目提到了在重复过程中,要不变为1,要不就会无限循环但始终变不到1、也就是说,将每个位置上的数字求平方和时会出现重复总和sum。因此这道题可以用哈希法求解,使用容器unordered_set,判断总和sum是否重复出现,如果重复出现则返回false,否则就一直寻找sum直到等于1.
参考代码如下:
// C++
class Solution {
public:
// 功能函数,用于求解平方和
int getSum(int n) {
int sum = 0;
while (n) {
sum += (n % 10) * (n % 10);
n /= 10;
}
return sum;
}
// 主函数,判断是否为快乐数
bool isHappy(int n) {
// 创建一个unordered_set容器用于记录出现过的总和数
unordered_set<int> record;
while(true) {
int sum = getSum(n);
// 总和等于一就是快乐数
if (sum == 1) {
return true;
}
// 如果总和重复出现,则证明进入了无限循环,此时return false即可
if (record.find(sum) != record.end()) {
return false;
}
// 如果该总数没出现过,则插入容器record中
else {
record.insert(sum);
}
// 更新变量 n 的值
n = sum;
}
}
};
2.2、题目二:四数相加 II
链接:454. 四数相加 II - 力扣(LeetCode)
(1) 描述
(2) 举例
(3) 解题
这道题提供了四个int类型的数组A,B,C,D,最终要我们计算:
- 有多少个元组?
- 使得
A[i] + B[j] + C[k] + D[l] = 0
参考代码如下:
// C++
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
// 定义计数器变量,用于统计 nums1[i] + nums2[j] + nums3[k] + nums4[l] = 0 出现的次数
int count = 0;
// 定义一个unordered_map容器record,其中 key指元素之和,value指当前元素之和出现的次数
unordered_map<int, int> record;
// 遍历nums1和nums1数组,记录元素a+b的和,以及出现的次数
for (int a : nums1) {
for (int b : nums2) {
record[a + b]++;
}
}
// 接着遍历nums3和nums4数组,记录元素c+d的和
for (int c : nums3) {
for (int d : nums4) {
// 如果在数组record中可以找到 0-(c+d),则代表a+b+c+d=0,此时count加上当前key的value值
if (record.find(0 - (c + d)) != record.end()) {
count += record[0 - (c + d)];
}
}
}
// 最后返回统计结果
return count;
}
};
3、写在最后
好了,今天就刷到这里,明天再来。