242.有效的字母异位词
刚学哈希表想着使用unordered_set来实现,结果无法通过,原因是对字母异位词理解有问题,字母异位词是通过重新排列不同单词或短语的字母而形成的单词或短语,并使用所有原字母一次。对字母出现的次数有要求,无法使用unordered_set
bool isAnagram(string s, string t) {
std::unordered_set<char> _slist;
for(int i = 0; i < s.size(); i++){
_slist.insert(s[i]);
}
std::unordered_set<char> _tlist;
for(int j = 0; j < t.size(); j++){
_tlist.insert(t[j]);
}
bool flag = _slist == _tlist;
if(flag){
return s.size() == t.size();
}else{
return flag;
}
}
正确方法 1:学习使用数组来做哈希表
bool isAnagram(string s, string t) {
int record[26] = {0};
for(int i = 0; i < s.size(); i++){
record[s[i] - 'a']++;
}
for(int j = 0; j < t.size(); j++){
record[t[j] - 'a']--;
}
for(int k = 0; k < 26; k++){
if(record[k] != 0){
return false;
}
}
return true;
}
正确方法2: 利用multiset特性(值有序并且可以重复)
bool isAnagram(string s, string t) {
std::multiset<char> s_set;
for(int i = 0; i < s.size(); i++){
s_set.insert(s[i]);
}
std::multiset<char> t_set;
for(int j = 0; j < t.size(); j++){
t_set.insert(t[j]);
}
return s_set == t_set;
}
349.两个数组的交集
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
vector<int> result;
std::unordered_set<int> nums1_set;
for(int i = 0; i < nums1.size(); i++){
nums1_set.insert(nums1[i]);
}
std::unordered_set<int> nums2_set;
for(int j = 0; j < nums2.size(); j++){
nums2_set.insert(nums2[j]);
}
for(const auto& elem : nums1_set){
if(nums2_set.find(elem) != nums2_set.end()){
result.push_back(elem);
}
}
return result;
}
202.快乐数
练习如何进行单数之和计算,以及如何判断退出机制
// 如果这个sum曾经出现过,说明已经陷入了无限循环了,立刻return false
int getSum(int n){
int sum = 0;
do{
int yushu = (n % 10) * (n % 10);
sum += yushu;
n = n / 10;
}while(n != 0);
return sum;
}
bool isHappy(int n) {
std::unordered_set<int> result;
while(1){
int sum = getSum(n);
if(sum == 1){
return true;
}else{
if(result.find(sum) != result.end()){
return false;
}else{
result.insert(sum);
}
}
n = sum;
}
}
1.两数之和
//a暴力解法
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> result;
for(int i = 0; i < nums.size() - 1; i++){
for(int j = i+1; j < nums.size(); j++){
if(nums[i]+nums[j] == target){
result.push_back(i);
result.push_back(j);
return result;
}
}
}
return result;
}
//b学习使用map对象,主要了解何时使用哈希法
vector<int> twoSum(vector<int>& nums, int target) {
std::unordered_map<int,int> nums_map;
for(int i = 0; i < nums.size(); i++){
if(nums_map.find(target - nums[i]) != nums_map.end()){
return {nums_map.find(target-nums[i])->second, i};
}else{
nums_map.insert(pair<int,int>(nums[i], i));
}
}
return {};
}