
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情
1、写在前面
大家好,我是翼同学,这里是【水滴计划 | 刷题日志】
每日两题,拒绝摆烂。
2、内容
2.1、题目一:快乐数
链接:202. 快乐数 - 力扣(LeetCode)
(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,最终要我们计算:
有多少个元组(i,j,k,l)参考代码如下:
// 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、写在最后
好了,今天就刷到这里,明天再来。