前言:
关于哈希表的遍历,我觉得可以参考这篇博文.一般常见的可以用auto来遍历,用first和second来索引key和value,也可以用迭代器来遍历。
2的幂
直接先上题目,这个题目我的一个思路使用set,注意到set它只会存元素,没有索引,唯一的搜索方式就是.count和.find,不像map这种key索引。注意到n如果是的话一定是只有一个1的二进制数。所以可以用方法2和3
class Solution {
public:
bool isPowerOfTwo(int n) {
// int是可以到2的30次方。
if(n<=0)
return false;
unordered_set<int>set;
for(int i=0;i<=30;i++){
set.insert(pow(2,i));
}
if(set.count(n))
return true;
return false;
}
};
class Solution {
public:
bool isPowerOfTwo(int n) {
return n > 0 && (n & (n - 1)) == 0;
}
};
class Solution {
public:
bool isPowerOfTwo(int n) {
return n > 0 && (n & -n) == n;
}
};
n和他的相反数相互与,得到的是保留最低一位1的结果其他全部变成0
面试题 01.01. 判定字符是否唯一
class Solution {
public:
bool isUnique(string astr) {
unordered_set<char>set;
for(int i=0; i<astr.size();i++){
if(set.count(astr[i]))
return false;
set.insert(astr[i]);
}
return true;
}
};
面试题 01.02. 判定是否互为字符重排
题目:
给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
class Solution {
public:
bool CheckPermutation(string s1, string s2) {
if(s1.size() != s2.size())
return false;
unordered_map <char, int> umap;
for(int i = 0; i < s1.size(); i++) //连连看
{
++umap[s1[i]];
--umap[s2[i]];
}
for(int i = 0; i < s1.size(); i++) //判断连连看的结果
{
if(umap[s1[i]] != 0)
return false;
}
return true;
}
};
或者用迭代器:
class Solution {
public:
bool CheckPermutation(string s1, string s2) {
if(s1.size() != s2.size())
return false;
unordered_map <char, int> umap;
for(int i = 0; i < s1.size(); i++) //连连看
{
++umap[s1[i]];
--umap[s2[i]];
}
for(auto & map:umap) //判断连连看的结果
{
if(map.second != 0)
return false;
}
return true;
}
};
或者排序:
class Solution {
public:
bool CheckPermutation(string s1, string s2)
{
sort(s1.begin(),s1.end());
sort(s2.begin(),s2.end());
if(s1==s2)
{
return true;
}
else
{
return false;
}
}
};