class Solution {
public:
bool isAnagram(string s, string t) {
int arr[26]={0};
for(int i=0;i<s.size();i++)
{
arr[s[i]-'a']++;
}
for(int i=0;i<t.size();i++)
{
arr[t[i]-'a']--;
}
for(int i=0;i<26;i++)
{
if(arr[i]!=0)
{
return false;
}
}
return true;
}
};
要理解s[i]-'a',首先要明白字符的本质是整数
字符实际上是整数类型,字符之间的运算就是整数运算;
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int arr[26]={0};
for(int i=0;i<ransomNote.size();i++)
{
arr[ransomNote[i]-'a']++;
}
for(int i=0;i<magazine.size();i++)
{
arr[magazine[i]-'a']--;
}
for(int i=0;i<26;i++)
{
if(arr[i]>0)
{
return false;
}
}
return true;
}
};
set容器插入只有insert
分为三种类型set不允许有重复的元素,multiset允许有重复的元素,底层实现是红黑树,是有序的
unordered_set底层实现是哈希表,查找效率更高,数值不允许重复,是无序的
1.由于数组大小为1000所以可以使用数组
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
int arr[1001]={0};
for(int i=0;i<nums1.size();i++)
{
for(int j=0;j<nums2.size();j++)
{
if(nums1[i]==nums2[j])
{
arr[nums1[i]]++;
}
}
}
vector<int> temp;
for(int i=0;i<1001;i++)
{
if(arr[i]>0)
{
temp.push_back(i);
}
}
return temp;
}
};
2.使用set容器
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
set<int> s2(nums2.begin(),nums2.end());
set<int> s1(nums1.begin(),nums1.end());
vector<int> arr;
for(int val:s2)
{
if(s1.find(val)!=s1.end())
{
arr.push_back(val);
}
}
return arr;
}
};
这道题目也可以使用unordered_set,s1.fin(val)是看s1容器中是否有等于val的元素,如果有返回指向该元素迭代器,如果没有返回s1.end()
由于题目中说了可能无限循环所以我们要进行判断是否早已经出现了这个数,所以我们应该用哈希表进行判断
class Solution {
public:
int getsum(int n)
{
int sum=0;
while(n)
{
sum=(n%10)*(n%10)+sum;
n=n/10;
}
return sum;
}
bool isHappy(int n) {
if(n==1)
{
return true;
}
int sum=0;
unordered_set<int> s;
while(1)
{
sum=getsum(n);
if(sum==1)
{
return true;
}
else
{
if(s.find(sum)!=s.end())
{
return false;
}
else
{
s.insert(sum);
}
}
n=sum;
}
}
};
不要忘记改变数值n=sum
1,暴力解法
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> temp;
for(int i=0;i<nums.size();i++)
{
for(int j=i+1;j<nums.size();j++)
{
if(nums[i]+nums[j]==target)
{
temp.push_back(i);
temp.push_back(j);
}
}
}
return temp;
}
};
2.每当我们需要判断一个元素曾经是否出现过我们就要思考是否使用哈希表的方法
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> m;
for(int i=0;i<nums.size();i++)
{
auto it=m.find(target-nums[i]);
if(it!=m.end())
{
return {it->second,i};
}
else
{
m.insert(pair<int,int>(nums[i],i));
}
}
return {};
}
};