大概的方法就是将所有出现的字母先转换为数字都放在数组当中,然后再遍历另一个字母的时候,我们再从原来的字母减掉
class Solution {
public:
bool isAnagram(string s, string t) {
int record[26]={0};
for(int i=0;i<s.size();i++){
record[s[i]-'a']++;
}
for(int i=0;i<t.size();i++){
record[t[i]-'a']--;
}
for(int i=0;i<26;i++){
if(record[i]!=0){
return false;
}
}
return true;
}
};
使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set;
unordered_set<int> find_set(nums1.begin(),nums1.end());
for(int num:nums2){
if(find_set.find(num)!=find_set.end()){
result_set.insert(num);
}
}
return vector<int>(result_set.begin(),result_set.end());
}
};
因为leetcode到了后面对数据进行了改版,所以现在我们可以直接定义一个大概大小为1005的数组进行操作就行了
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set;
int arrary[1005]={0};
for(int i:nums1){
arrary[i]=1;
}
for(int i:nums2){
if(arrary[i]==1){
result_set.insert(i);
}
}
return vector<int>(result_set.begin(),result_set.end());
}
};
题目中说了会?无限循环,那么也就是说求和的过程中,sum会重复出现,这对解题很重要!
所以这道题目使用哈希法,来判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止。
class Solution {
public:
int get_sum(int n){
int sum=0;
while(n){
sum+=(n%10)*(n%10);
n/=10;
}
return sum;
}
public:
bool isHappy(int n) {
int sum=0;
unordered_set<int> result_set;
while(1){
sum=get_sum(n);
if(sum==1){
return true;
}
if(result_set.find(sum)!=result_set.end()){
return false;
}else{
result_set.insert(sum);
}
n=sum;
}
}
};
在这里我们主要是要注意用map的思想来解决问题
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int> map;
for(int i=0;i<nums.size();i++){
auto item=map.find(target-nums[i]);
if(item!=map.end()){
return {item->second,i};
}else{
map.insert(pair<int,int>(nums[i],i));
}
}
return {};
}
};