【LeetCode】day6:242 - 有效的字母异位词,349 - 两个数组的交集, 202 - 快乐数, 1 - 两数之和

242.有效的字母异位词

题目描述:

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例 1:
输入: s = “anagram”, t = “nagaram”
输出: true
示例 2:
输入: s = “rat”, t = “car”
输出: false

字母异位词的定义在于字符出现的次数,使用数组记录每个字符出现的次数并比较即可,代码如下。注释部分的代码是因为当两字符串长度相同时,在对第二个字符串进行遍历时若两字符串不是异位词,则一定会出现数组某位置小于0的情况,所以无需进行再对数组遍历。

class Solution {
public:
    bool isAnagram(string s, string t) {
        if (s.size() != t.size()) return false;
        int record[26] = {};
        for (char c : s) {
            ++record[c - 'a'];
        }
        for (char c : t) {
            if (--record[c - 'a'] < 0) {
                return false;
            }
        }
        // for (int i = 0; i < 26; ++i) {
        //     if (record[i] != 0) {
        //         return false;
        //     }
        // }
        return true;
    }
};

349.两个数组的交集

题目描述:

给定两个数组 nums1 和 nums2 ,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

使用HashSet对其中一个数组进行遍历并记录元素出现的情况,再对另一个数组遍历,若HashSet中存在当前元素则为交集元素,将其存入res中。由于交集元素可能为多个,在遍历处理时使用HashSet进行保存,最后再将其转换为vector返回。代码如下:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> nums1_set(nums1.begin(), nums1.end());
        unordered_set<int> res;
        for (int num : nums2) {
            if (nums1_set.count(num)) {
                res.insert(num);
            }
        }
        return vector<int>(res.begin(), res.end());
    }
};

202.快乐数

题目描述:

编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
示例 1:
输入:n = 19
输出:true
解释:
1 2 + 9 2 = 82 1^2 + 9^2 = 82 12+92=82
8 2 + 2 2 = 68 8^2 + 2^2 = 68 82+22=68
6 2 + 8 2 = 100 6^2 + 8^2 = 100 62+82=100
1 2 + 0 2 + 0 2 = 1 1^2 + 0^2 + 0^2 = 1 12+02+02=1
示例 2:
输入:n = 2
输出:false

记录每次的平方和,若平方和重复出现则代表进入无限循环,返回false,反之出现1则返回true。判断结果是否出现,使用HashSet进行保存。代码如下:

class Solution {
public:
    int getSum(int n) {
        int cur = 0;
        while (n != 0) {
            int tmp = n % 10;
            cur += tmp * tmp;
            n /= 10;
        }
        return cur;
    }
    bool isHappy(int n) {
        unordered_set<int> sum;
        while (true) {
            int cur = getSum(n);
            if (cur == 1) {
                return true;
            }
            if (sum.count(cur) == 1) {
                return false;
            } else {
                sum.insert(cur);
            }
            n = cur;
        }
    }
};

1.两数之和

题目描述:

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]

思路是对数组元素进行遍历,并在过程中使用HashMap对当前数组索引以及元素进行记录,key表示元素的值,value表示索引。在每次遍历时,对于当前值 c u r cur cur,若 t a r g e t − c u r target-cur targetcur在Map中存在则表示能使和为target的值在之前出现过,满足条件可通过map获取到索引和当前值索引作为结果返回;若未找到则将当前值和索引存入map中。代码如下:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> numMap;
        for (int i = 0; i < nums.size(); ++i) {
            int dif = target - nums[i];
            if (numMap.count(dif)) {
                int index = numMap.at(dif);
                return {index, i};
            } else {
                numMap.insert(pair<int, int>(nums[i], i));
            }
        }
        return {};
    } 
};
  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值