Problem 242. Valid Anagram
-
题目描述
Given two strings s and t , write a function to determine if t is an anagram of s.Example:
Input: s = "anagram", t = "nagaram" Output: true
-
解题思路
要判断一个字符串是否由另一个字符串的字符重组而成,最容易想到的办法是对两个字符串进行排序,如果排序后两个字符串相等则返回 true,但这种做法的时间复杂度较高。
一个 O(n) 时间复杂度的算法是,分别遍历两个字符串,统计字符串的字符种类和数量是否完全相等,相等则返回 true。
以下分别使用 C++ 和 Python 实现:
- 对于 C++,定义一个具有26个元素的 nums 数组,并将每个元素初始化为 0。遍历第一个字符串 s,将出现过的字符在 nums 中对应的下标加 1;遍历第二个字符串 t,将出现过的字符在 nums 中对应的下标减 1。最后判断 nums 中的元素是否为0即可。
- 对于 Python,使用 Counter 便可一行代码解决。
- 代码实现
- 以下分别是C++和Python的代码
class Solution {
public:
bool isAnagram(string s, string t) {
vector<int> count(26, 0);
for(auto c : s)
count[c-'a']++;
for(auto c : t)
count[c-'a']--;
for(auto i : count)
if(i != 0)
return false;
return true;
}
};
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
return Counter(s) == Counter(t)
Problem 326. Power of Three
-
题目描述
Given an integer, write a function to determine if it is a power of three.Example:
Input: 27 Output: true
-
解题思路
既然不能使用循环,那最简单的办法就是利用对数函数进行判断。然而C++没有以3为底的对数函数,所以需要用换底公式换为以10为底的对数再进行运算。 -
代码实现
以下分别时C++和python的代码:
class Solution {
public:
bool isPowerOfThree(int n) {
return fmod(log10(n)/log10(3), 1) == 0;
}
};
import math
class Solution:
def isPowerOfThree(self, n: int) -> bool:
if n <= 0:
return False
return (math.log10(n)/math.log10(3))%1.0 == 0
Problem 350. Intersection of Two Arrays II
-
题目描述
Given two arrays, write a function to compute their intersection.Example:
Input: nums1 = [4,9,5], nums2 = [9,4,9,8,4] Output: [4,9]
-
解题思路
本题要求两个集合的交集,且允许元素重复。
以下分别使用 C++ 和 Python 实现:
- 对于 C++,可建立一个 unordered_map<int, int> 变量 m,用来记录 nums1 中出现的元素以及每个元素出现的次数。接着判断 nums2 中的元素 num 是否在 m 中,且m[num]> 0,是则将 num 存入交集 res 中,并将 m[num] 的值减1。
- 对于 Python,可使用 Counter 对 nums1 进行处理,再转化成字典类型的变量 dic。以同样的方式对 nums2 中的元素进行遍历并处理即可。
- 代码实现
以下分别是C++和Python的代码
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
vector<int> res;
unordered_map<int, int> m;
for(auto num:nums1)
m[num]++;
for(auto num:nums2)
if(m[num]-- > 0)
res.push_back(num);
return res;
}
};
class Solution:
def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
res = []
dic = dict(Counter(nums1))
for num in nums2:
if num in dic and dic[num]>0:
dic[num] -= 1
res.append(num)
return res