目录
242.有效的字母异位词
思路:利用数组进行存储,最重要的是s[i] - 'a',把下标控制在0-25里面了,一个字符串负责把里面的字符进行加值,另一个字符串进行减值,然后如果这个两个字符串是异位词就说明我们建的数组肯定是空的。
class Solution {
public:
bool isAnagram(string s, string t) {
int arr[26] = {0};//设置数组
//减a以后刚好和从a到z一一对应0到25
for(int i = 0; i < s.length(); i++){//把字符串s遍历一遍
arr[s[i] - 'a']++;//如果有进去的就++,因为字符串只有小写字母,因此arr的范围是0到25,刚刚好
}
for(int j = 0; j < t.length(); j++){
arr[t[j] - 'a']--;//如果t字符串里面有符合的就--
}
//如果两个是异位词那么int数组肯定为0,不等0就说明不是异位词,因为值都会给减回去
for(int k = 0; k < 26; k++){
if(arr[k] != 0){
return false;
}
}
return true;
}
};
349. 两个数组的交集
思路:我们先把两个vector集合放进set里面去掉重复元素(可能时间会慢一点),然后循环s1集合,s2用find集合来找有没有对应的值,如果有就说明这个值是交集元素
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
//使用set容器,把重复元素删了
unordered_set<int> s1;
unordered_set<int> s2;
vector<int> vector;
//把值赋给set容器里面,可以去重复值,缩短时间
for(int i = 0; i < nums1.size(); i++){
s1.insert(nums1[i]);
}
for(int i = 0; i < nums2.size(); i++){
s2.insert(nums2[i]);
}
//迭代器遍历,如果s1里面的值可以在s2里面用find找到就说明是交集元素,加到vector里面
for(unordered_set<int>::iterator it = s1.begin(); it != s1.end(); it++){
if(s2.find(*it) != s2.end()){
vector.push_back(*it);
}
}
return vector;
202. 快乐数
我们写一个单独的计算平方和的函数(怎么求出个位数是关键),然后在isHappy调用,如果得到的值等于1,就说明这个数是快乐数,如果不等于1,就把他插到我们的set集合里面(用哈希表查某个数快),后面如果在集合里面再出现了就说明陷入无限循环了。
class Solution {
public:
int getNum(int n){
int sum = 0;//等到n然后拆开平方加起来之后,拿用来记录加起来的值然后返回
while(n){//如果被除干净了等于0就退出
sum += (n % 10) * (n % 10);//得到个位然后平方
n = n / 10;
}
return sum;
}
bool isHappy(int n) {
unordered_set<int> s;//用来记录平方过的值,如果有出现过就说明要无限循环了
while(true){
int num = getNum(n);//接收平方值
if(num == 1){//如果等于1,就返回
return true;
}
if(s.find(num) == s.end()){//如果没在集合里面,就加进去
s.insert(num);
}else{//如果出现了,就返回fasle
return false;
}
n = num;
}
}
}
1. 两数之和
使用双指针,慢指针在后,快指针快速遍历一圈看慢,快指针下标的值之和有没有等于target,没有就让慢指针++,快指针重新到慢指针的前一位,但是因为是两个循环速度慢一些。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> v;//定义一个vector集合
int slow = 0;
int fast = 0;
//慢指针的值必须小于target,不然fast肯定大于0,只会越加越大
while(slow < nums.size()){
for(fast = slow + 1; fast < nums.size(); fast++){
if(nums[fast] + nums[slow] == target){//如果等于就记录这两个下标
v.push_back(slow);
v.push_back(fast);
break;
}
}
slow++;
}
return v;
}
};