代码随想录算法训练营第六天| 242.有效的字母异位词,349.两个数组的交集,202.快乐数,1.两数之和
242. 有效的字母异位词
mydemo--(成功)--(学了卡哥的思路)
class Solution {
public:
bool isAnagram(string s, string t) {
int alphabet = 26;
int hash[alphabet];
for(int i=0; i<alphabet; i++)
{
hash[i] = 0;
}
//for(int i=0; i<(s.length()-1); i++) //字符串末尾 /0
for(int i=0; i<(s.length()); i++)
{
hash[s[i]-'a']++;
}
//for(int i=0; i<(t.length()-1); i++)
for(int i=0; i<(t.length()); i++)
{
hash[t[i]-'a']--;
}
for(int i=0; i<alphabet; i++)
{
if(hash[i]!=0)
return false;
}
return true;
}
};
关于
//for(int i=0; i<(s.length()-1); i++) //字符串末尾 /0
for(int i=0; i<(s.length()); i++)
确实,c++中的string最后有一个/0,但是length()和size()并不会包含/0,即
s.length() = s.真实长度 - 1;
s.size() = s.真实长度 - 1;
卡哥demo
lass Solution {
public:
bool isAnagram(string s, string t) {
int record[26] = {0};
for (int i = 0; i < s.size(); i++) {
// 并不需要记住字符a的ASCII,只要求出一个相对数值就可以了
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) {
// record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。
return false;
}
}
// record数组所有元素都为零0,说明字符串s和t是字母异位词
return true;
}
};
349.两个数组的交集
mydemo-(自己的思路)-(错误)
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
vector<int> result;
//int hash1[hashsize] = {0};
//int hash2[hashsize] = {0};
//int hash2[hashsize] = {0};
int hash1[10] = {0};
int hash2[10] = {0};
for(int i=0; i<nums1.size(); i++)
{
hash1[nums1[i]-0]++;
}
for(int i=0; i<nums2.size(); i++ )
{
hash2[nums2[i]-0]++;
}
for(int i=0; i<10; i++)
{
if(hash1[i] == hash2[i] && hash1[i]!=0)
result.push_back(i);
}
return result;
}
};
错误原因:
if(hash1[i] == hash2[i] && hash1[i]!=0)
考虑以下例子:【1,2,3】,【1,2,2,2,3,4,5】。在哈希表1中,2有1个;在哈希表2中,2有3个,所以不满足hash1[i] == hash2[i]
正确写法:
if(hash1[i]!=0 && hash2[i]!@=0)
mydemoV2-(自己的思路)-(成功)
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
vector<int> result;
//int hashsize= 1000;
//int hash1[hashsize] = {0};
//int hash2[hashsize] = {0};
int hash1[1000] = {0};
int hash2[1000] = {0};
for(int i=0; i<nums1.size(); i++)
{
hash1[nums1[i]-0]++;
}
cout << "hash1:" <<endl;
for(int i=0; i<10; i++)
{
cout << hash1[i] << " ";
}
cout << endl;
for(int i=0; i<nums2.size(); i++ )
{
hash2[nums2[i]-0]++;
}
cout << "hash2:" <<endl;
for(int i=0; i<10; i++)
{
cout << hash2[i] << " ";
}
for(int i=0; i<1000; i++)
{
if(hash1[i]!=0 && hash2[i]!=0)
result.push_back(i);
}
return result;
}
};
时间复杂度 O(n)
空间复杂度 O(1)
关于
//int hashssize = 1000;
//int hash1[hashsize] = {0};
//int hash2[hashsize] = {0};
报错,使用变量定义长度时,不可在定义时同时进行初始化赋值,需要在之后进行赋值
mydemoV3-(卡哥思路)-(成功)
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
vector<int> result;
int hash1[1000] = {0};
for(int i=0; i<nums1.size(); i++)
{
hash1[nums1[i]-0]++;
}
cout << "hash1:" <<endl;
for(int i=0; i<10; i++)
{
cout << hash1[i] << " ";
}
cout << endl;
for(int i=0; i<nums2.size(); i++ )
{
if(hash1[nums2[i]] != 0)
{
result.push_back(nums2[i]);
hash1[nums2[i]] = 0;
}
}
return result;
}
};
卡哥代码
关于 unorderd_set的语法的博客:https://www.cnblogs.com/JCpeng/p/15227986.html
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set;
unordered_set<int> nums_set(nums1.begin(), nums1.end());
for(int num : nums2){
if(nums_set.find(num) != nums_set.end())
{
result_set.insert(num);
}
}
return vector<int>(result_set.begin(), result_set.end());
}
};
202.快乐数
卡哥代码
(取位运算不熟)
class Solution {
public:
int getSum(int n)
{
int sum=0;
while(n)
{
sum = sum + (n%10) * (n%10);
n /= 10;
}
return sum;
}
bool isHappy(int n) {
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. 两数之和
卡哥代码
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 iter = map.find(target - nums[i]);
if(iter != map.end()) //如果找到了
{
return {iter->second, i};
}
//没找到,则把当前遍历的值和索引hash到map中
map.insert(pair<int, int>(nums[i],i));
}
return {};
}
}
{ }
{ }表示容器,vector就是容器
https://www.cnblogs.com/linuxAndMcu/p/10254542.html
auto
auto可以在声明变量时根据变量初始值的类型自动匹配类型。
auto f = 3.14; //double
auto s("hello"); //const char*
auto z = new auto(9); //int *
auto x1 = 5, x2 = 5.0, x3 = 'r'; //错误,必须是初始化为同一类型
pair
将2个数据组合成一组数据