242.有效的字母异位词
解题思路:本题就是考察哈希表数组的运用,难度不大
解题代码:
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 count : record){
if(count != 0){
return false;
}
}
return true;
}
}
349. 两个数组的交集
解题思路:主要是针对哈希表中的set的运用。
将数组1保存在 set 中,遍历数组2,判断数组2中的元素是否出现在 set 中,出现即为符合题目条件的元素,放进返回结果的 set 中。
注意:需要把 set 对象转成 数组对象 返回 可以用 stream().mapToInt(a -> a).toArray() 进行转换
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
if(nums1 == null || nums1.length == 0 ||
nums2 == null || nums2.length == 0){
return new int[0];
}
Set<Integer> set = new HashSet<>();
Set<Integer> finalSet = new HashSet<>();
for(int i = 0;i < nums1.length;i++){
set.add(nums1[i]);
}
for(int i = 0;i < nums2.length;i++){
if(set.contains(nums2[i])){
finalSet.add(nums2[i]);
}
}
return finalSet.stream().mapToInt(a -> a).toArray();
}
}
202. 快乐数
解题思路:本题的关键点在于可能会出现 无限循环,也就是说求和的过程中,sum会重复出现,
同时对于处理 n 的 十位数 和 个位数 需要仔细理解
解题代码:
class Solution {
public boolean isHappy(int n) {
Set<Integer> record = new HashSet<>();
//n 不能等于1 并且 set集合里面也不包含 n
while(n != 1 && !record.contains(n)){
//set 集合记录每一次变化的后的 n
record.add(n);
n = getNextNumber(n);
}
return n == 1;
}
public int getNextNumber(int n){
//定义 sum 计算和
int sum = 0;
while(n > 0){
//求出 n 十位的数字
int temp = n % 10;
sum += temp * temp;
//求出 n 个位的数字
n = n /10;
}
return sum;
}
}
1.两数之和
解题思路:考察对哈希表中 map 的使用,理解 map 中的键值对存放什么非常重要!!!
map 中的:
- key ----> 出现的数字
- value ----> 出现数字对应的下标
遍历数组的时候需要去map中寻找 (目标值 - 当前遍历的值)是否在 map 中
解题代码:
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] res = new int[2];
if(nums == null || nums.length == 0){
return res;
}
//定义一个map k - 数字 v - 数字对应的下标
Map<Integer,Integer> map = new HashMap<>();
for(int i = 0;i < nums.length;i++){
int n = target - nums[i];
//判断当前 map 里是否有 (目标值 - 当前值)
if(map.containsKey(n)){
//如果有就存入数组
res[0] = i;
res[1] = map.get(n);
break;
}
//没找到就将当前这个数和对应下表存入map
map.put(nums[i],i);
}
return res;
}
}