目录
题目1
思路
t 是 s 的异位词等价于「两个字符串中字符出现的种类和次数均相等」。由于字符串只包含 26 个小写字母,因此我们可以维护一个长度为 26 的频次数组 table,先遍历记录字符串 s 中字符出现的频次,然后遍历字符串 t,减去 table 中对应的频次,如果出现 table[i]<0,则说明 t 包含一个不在 s 中的额外字符,返回 false 即可。
代码
//代码
class Solution {
public:
unordered_map<int,int>mp;
bool isAnagram(string s, string t) {
if(s.size()!=t.size())return false;
for(auto c:t){
mp[c-'0']++;
}
for(auto c:s){
mp[c-'0']--;
if(mp[c-'0']<0)return false;
}
return true;
}
};
题目2
思路
代码
//代码
//大佬写法
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
vector<int> ans;
unordered_set<int> us{ nums1.begin(), nums1.end() };
for (auto& iter : nums2) {
if (us.find(iter) != us.end()) {
us.erase(iter);
ans.emplace_back(iter);
}
}
return ans;
}
};
//我的写法
class Solution {
public:
set<int>s;
set<int>ans;
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
for(auto x : nums1)s.insert(x);
for(auto x :nums2){
if(s.find(x)!=s.end()){
ans.insert(x);
}
}
vector<int>res(ans.begin(),ans.end());//强转vector
return res;
}
};
题目3
思路
解题关键:题目中说了会 无限循环,那么也就是说求和的过程中,sum会重复出现,这对解题很重要!一旦sum不是1且重复出现那么可以知道:陷入了无限循环,直接返回false
代码
//代码
class Solution {
public:
int getSum(int n){
int sum=0;
while(n){
sum+=(n%10)*(n%10);
n/=10;
}
return sum;
}
set<int>s;
bool isHappy(int n) {
while(1){
int sum=getSum(n);
if(sum==1)return true;
if(s.find(sum)!=s.end()){
return false;
}else{
s.insert(sum);
}
n=sum;
}
}
};
题目4
思路
哈希表
代码
//代码
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer>mp=new HashMap<>();
for(int i=0;i<nums.length;i++){
if(mp.containsKey(target-nums[i])){
return new int[] {mp.get(target-nums[i]),i};
}
mp.put(nums[i],i);
}
return new int[0];
}
}