242.有效的字母异位词
思路:
使用哈希表,将s字符串里出现的字母频率做一个统计
然后再将t字符串里出现的字母频率在同一个哈希表上做--操作。
如果最后这个哈希表全部为0,那么两个字符串就是字母异位词。
class Solution {
public boolean isAnagram(String s, String t) {
if(s.length() != t.length()){
return false;
}
int[] nums = new int[26];
for(char c : s.toCharArray()){
nums[c - 'a']++;
}
for(char c : t.toCharArray()){
nums[c - 'a']--;
}
for(int i : nums){
if(i != 0){
return false;
}
}
return true;
}
}
349. 两个数组的交集
思路:
使用set(无序,唯一)来存储nums1中出现的数值
并且来判断nums2中的值是否在set中,如果在的话,就代表nums1也有。将其存到一个result set中。
最后将 result set转化为数组返回。
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> compare = new HashSet<>();
Set<Integer> result = new HashSet<>();
for(int i = 0; i < nums1.length; i++){
compare.add(nums1[i]);
}
for(int i = 0; i< nums2.length; i++){
if(compare.contains(nums2[i])){
result.add(nums2[i]);
}
}
int[] resNums = new int[result.size()];
int index = 0;
for(int i : result){
resNums[index++] = i;
}
return resNums;
}
}
202. 快乐数
思路:
比如n=81,将1方+8方的结果65放到set集合里,
再计算6方+5方的值m,如果m存在set里,那么就返回false,因为构成了循环永远都不可能为1。
如果不在set里就将其存到set里,一直计算直到算出1为止。
class Solution {
public boolean isHappy(int n) {
Set<Integer> set = new HashSet<>();
int m = 0;
while(true){
while(n != 0){
m += Math.pow(n%10 , 2);
n = n/10;
}
if(m == 1) return true;
if(set.contains(m)){
return false;
}
else{
set.add(m);
n = m;
m =0;
}
}
}
}
1. 两数之和
思路:
设置一个map,来存放已经遍历过的nums中的数据,注意要将nums的value当作map的key(原因后面讲)
然后去遍历nums中的数据,并且判断target-这个数据的数字是否在map中有(因为是map中的key,所以可以快速查询),存在的话就返回,不存在的话就把这个数据也存到map中。
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<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];
}
}