一、242. 有效的字母异位词
1.原题
class Solution {
public boolean isAnagram(String s, String t) {
int[] arr = new int[26];
for(int i = 0; i < s.length();i++){
char c = s.charAt(i);
int index = c - 97;
arr[index]++;
}
for(int j = 0; j < t.length();j++){
char ch = t.charAt(j);
int index1 = ch - 97;
arr[index1]--;
}
for(int k = 0; k < arr.length; k++){
if(arr[k] != 0){
return false;
}
}
return true;
}
}
此题用一个大小为26的数组模拟哈希表即可,无难度。
二、349. 两个数组的交集
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set = new HashSet<>();
Set<Integer> set2 = new HashSet<>();
for(int i = 0; i < nums1.length; i++){
set.add(nums1[i]);
}
for(int j = 0; j < nums2.length; j++){
if(set.contains(nums2[j])){
set2.add(nums2[j]);
}
}
return set2.stream().mapToInt(x -> x).toArray();
}
}
此题的的思路是使用set不会添加重复元素的原理进行去重, 最后set转换为int数组需要注意
注意
:以后遇到去重操作,先考虑set集合,原理为哈希表。
三、202.快乐数
class Solution {
public boolean isHappy(int n) {
Set<Integer> set = new HashSet<>();
while(n != 1 && !set.contains(n)){
set.add(n);
n = getNextNumber(n);
}
return n == 1;
}
public int getNextNumber(int n){
int sum = 0;
while(n > 0){
int i = n % 10;
sum += i * i;
n /= 10;
}
return sum;
}
}
此题难点在于思路每次运算结束后的数字不能与前面相等,相等就会循环
实现过程与上题类似,使用set不可重复的特性,进行判断即可。
四、1. 两数之和
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map = new HashMap<>();
int[] arr = new int[2];
for(int i = 0; i < nums.length; i++){
if(map.containsKey(target - nums[i])){
arr[0] = map.get(target - nums[i]);
arr[1] = i;
break;
}
map.put(nums[i],i);
}
return arr;
}
}
此题是力扣的第一题,思路是把每个数都放进map集合里,map不会重复且查找效率为O(1),然后判断有没有数和正在判断的数加起来等于目标数,如果有则返回,用map而不用set的原因是需要记录,该数的索引位置。