今日内容
242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和
有效的字母异位词
解题思路
- 使用哈希字母表记录每个字符出现的次数,遍历两个串,最后判断表是否全为0
实现
Java
class Solution {
public boolean isAnagram(String s, String t) {
int[] record = new int[26];
for(int i=0;i<s.length();i++){
record[s.charAt(i)-'a']++;
}
for(int i=0;i<t.length();i++){
record[t.charAt(i)-'a']--;
}
for(int i=0;i<record.length;i++){
if(record[i]!=0){
return false;
}
}
return true;
}
}
C++
class Solution {
public:
bool isAnagram(string s, string t) {
int record[26] = {0};
for(int i=0;i<s.size();i++){
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){
return false;
}
}
return true;
}
};
两个数组的交集
解题思路
- 使用hashset保存一个数组元素,可以去重,遍历另一个数组hashset中存在,保存到结果数组中
实现
Java
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
if(nums1.length==0 || nums2.length==0){
return new int[0];
}
HashSet<Integer> hashSet1 = new HashSet<>();
HashSet<Integer> hashSet2 = new HashSet<>();
for(int i=0;i<nums1.length;i++){
hashSet1.add(nums1[i]);
}
for(int i=0;i<nums2.length;i++){
if(hashSet1.contains(nums2[i])){
hashSet2.add(nums2[i]);
}
}
int[] res = new int[hashSet2.size()];
int j=0;
for(int i : hashSet2){
res[j++] = i;
}
return res;
}
}
C++
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> res ;
unordered_set<int> nums(nums1.begin(),nums1.end());//
for(int num : nums2){
if(nums.find(num) != nums.end()){//
res.insert(num);//
}
}
return vector<int>(res.begin(),res.end());
}
};
快乐数
解题思路
- 使用hashset存储中间过程的值,判断每次的各位平方和,等于1返回T,不等,如果重复出现,肯定不是快乐数F,未出现,添加到set
实现
Java
class Solution {
public boolean isHappy(int n) {
HashSet<Integer> hashSet = new HashSet<>();
while(n!=1 && !hashSet.contains(n)){
hashSet.add(n);
n = getNextNum(n);
}
return n==1;
}
public int getNextNum(int n){
int res = 0;
while(n!=0){
int tmp = n%10;
res += tmp*tmp;
n /= 10;
}
return res;
}
}
C++
class Solution {
public:
int getSum(int n){
int sum = 0;
while(n!=0){
sum += (n%10)*(n%10);
n=n/10;
}
return sum;
}
bool isHappy(int n) {
unordered_set<int> nums;
while(1){
int sum = getSum(n);
if(sum==1){
return true;
}
if(nums.find(sum) != nums.end()){
return false;
}else{
nums.insert(sum);
}
n = sum;
}
}
};
两数之和
解题思路
- 使用hashmap,遍历数组,如果存在target-num[i],直接返回这两数,不存在,存map
实现
Java
class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer,Integer> map = new HashMap<>();
for(int i=0;i<nums.length;i++){
if(map.containsKey(target-nums[i])){
return new int[]{map.get(target-nums[i]),i};
}
map.put(nums[i],i);
}
return new int[0];
}
}
C++
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
std::unordered_map<int,int> map;//定义map
for(int i=0;i<nums.size();i++){
auto iter = map.find(target-nums[i]);//第一个查找会返回一个迭代器
if(iter != map.end()){
return vector<int>{iter->second,i};//iter->second 表示 map 中键对应的值
}else{
map.insert(pair<int,int>(nums[i],i));//使用pair
}
}
return vector<int>{0};
}
};