【水滴计划 | 每日两题】:快乐数、四数相加 II

112 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情

1、写在前面

大家好,我是翼同学,这里是【水滴计划 | 刷题日志】

每日两题,拒绝摆烂。

2、内容

2.1、题目一:快乐数

链接:202. 快乐数 - 力扣(LeetCode)

(1) 描述

image.png

(2) 举例

image.png

image.png

image.png

(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) 描述

image.png

(2) 举例

image.png

image.png

image.png

(3) 解题

这道题提供了四个int类型的数组A,B,C,D,最终要我们计算:

  • 有多少个元组(i,j,k,l)(i, j, k, l)
  • 使得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、写在最后

好了,今天就刷到这里,明天再来。