242 有效的字母异位词 | 349 两个数组的交集 | 202 快乐数 | 1 两数之和

444 阅读1分钟

242 有效的字母异位词

题目描述:给定两个字符串 s 和 t,编写一个函数来判断 t 是否是 s 的字母异位词。

若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

思路

本题主要是记录 s 和 t里面字符出现的次数,关键在于如何尽可能高效。哈希表做这件事就很擅长,通过映射,例如,将小写字母a映射成0,小写字母b映射成1,只需遍历一次字符串,将字符对应数组位置的值++,即可完成统计。之后,按照同样的思路,统计 t 中字符出现的次数,将字符对应数组位置的值--。最后遍历该数组,如果所有值均为0,说明 s 和 t 互为异位词,否则,不是。

代码

 class Solution {
 public:
     bool isAnagram(string s, string t) {
         int arr[26] = {0};  // hash table
         for (int i = 0; i < s.length(); i++)
         {
             arr[s[i] - 'a']++;
         }
         for (int j = 0; j < t.length(); j++)
         {
             arr[t[j] - 'a']--;
         }
 ​
         for (int k = 0; k < 26; k++)
         {
             if (arr[k] != 0)
                 return false;
         }
         return true;
     }
 };

349 两个数组的交集

题目描述:给定两个数组 nums1 和 nums2,返回他们的交集。

要求:输出结果中的每个元素是唯一的,可以不考虑输出结果的顺序。

思路

首先利用set对nums1和nums2中的内容进行去重,之后判断nums2中的元素是否在nums1中出现,若出现,则将该元素push到result中,否则,忽略。

代码

 class Solution {
 public:
     vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
         // nums1、nums2中都可能有重复元素
         unordered_set<int> uset1;  // unordered_set:O(n) 哈希表
         unordered_set<int> uset2;
         vector<int> result;
         for (int i = 0; i < nums1.size(); i++) // 去重
         {    
             uset1.insert(nums1[i]);
         }
         for (int i = 0; i < nums2.size(); i++)
         {
             uset2.insert(nums2[i]);
         }
         // nums2(去重后)中的元素是否在nums1中出现
         for (auto it = uset2.begin(); it != uset2.end(); it++)
         {
             if (uset1.count(*it) != 0)
             {
                 result.push_back(*it);
             }
         }
         return result;
     }
 };

202 快乐数

题目描述:编写一个算法来判断一个数 n 是不是快乐数。

截屏2023-01-18 16.15.12.png

思路

关键:在于是否会无限循环,所谓无限循环就是平方和结果 sum 会重复出现,因此只需要记录每次平方和结果,如果下一次平方和结果出现过,说明陷入死循环,不是快乐数;而如果sum等于1,说明是快乐数。

代码

 class Solution {
 public:
     /** 返回 n 各位的平方和 */
     int getSum(int n)
     {
         int sum = 0;
         while (n != 0)
         {
             int k = n % 10;
             sum += k * k;
             n /= 10;
         }
         return sum;
     }
 ​
     bool isHappy(int n) {
         /** 是否出现死循环,即sum值是否会重复出现 */
         unordered_set<int> record;
         while (1)
         {
             n = getSum(n);  
             if (n == 1)
                 break;
             if (record.count(n) != 0) // 结果重复,陷入死循环
                 return false;
             else
                 record.insert(n);
         }
         return true;
     }
 };

1 两数之和

题目描述:给定一个整数数组 nums 和一个整数目标值 target,在该数组中找出和等于target 的那两个整数,并返回它们的数组下标。

思路

参考:mp.weixin.qq.com/s/fSyJVvggx…

代码

1. 暴力搜索

 class Solution {
 public:
     vector<int> twoSum(vector<int>& nums, int target) {
         vector<int> result;
         for (int i = 0; i < nums.size(); i++)
         {
             int del_num = target - nums[i];
             for (int j = i + 1; j < nums.size(); j++)
             {
                 if (nums[j] == del_num)
                 {
                     result.push_back(i);
                     result.push_back(j);
                     return result;
                 }
             }
         }
         return {};
     }
 };

时间复杂度:O(n2)