242. 有效的字母异位词
要求是给定两个字符串
s和t,编写一个函数来判断t是否是s的字母异位词。
🍅 数组解法(哈希表),即使用一个数组存储每个字母出现的次数,相比较看两个字符串是否组成元素相同
要注意的是在java中数组的length不用加(),字符串的length要加()。另外要理解的是s.chatAt()函数的作用是获取字符串对应下标的值,那么-'a'后就可以理解成每个字母的索引,a对应的就是0,++和--代表对应元素的数量。
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. 两个数组的交集
给定两个数组
nums1和nums2,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
🍅 集合解法(哈希表),即使用两个集合,一个集合录入数组的元素,另一个集合用来输出交集,最后把集合转换成数组
做这道题之前要掌握的是java集合不能存放基本数据类型,只能存放对象的引用,如int--integer。还有就是mapToInt()函数作用是把哈希表元素类型转为int,函数体里面是转换的格式。
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> set1 = new HashSet<>(); //set1用来遍历数组1
Set<Integer> set2 = new HashSet<>(); //set2用来输出交集(集合不允许重复,自动去重)
for (int i: nums1) {
set1.add(i);
}
for (int i: nums2) {
if (set1.contains(i)) {
set2.add(i);
}
}
return set2.stream().mapToInt(q->q).toArray(); //把集合转为数组
}
}
202. 快乐数
要求是给一个数,通过求每个位置上的数平方和是否为1来判断是不是快乐数
🍅 集合解法(哈希表),即用一个集合统计平方和,看最后结果是否为1
因为可能无限循环n无法变成1,所以用集合可以防止元素重复。
class Solution {
public boolean isHappy(int n) {
Set<Integer> set1 = new HashSet<>();
//当出现重复元素或者平方和已经等于1,则退出循环
while (n != 1 && !set1.contains(n)) {
set1.add(n);
n=getnextnumber(n);
}
return n == 1;
}
//定义函数得到下个平方和
int getnextnumber(int n) {
int res = 0;
while(n > 0){
int x = n%10;
res += x*x;
n = n/10;
}
return res;
}
}
1. 两数之和
给定一个整数数组
nums和一个整数目标值target,请你在该数组中找出 和为目标值target的那 两个 整数,并返回它们的数组下标
🍅 map解法(哈希表)解法,即通过使用map的key和value,判断和target的差值是是否出现过,如果出现,返回它们的下标位置。
这道题要求是我们判断差值是否出现在集合里,所以想到用哈希表的方式来解题。并且还要返回下标,所以使用map。要注意的是map的key放的是数组的值,value放的是数组的下标,因为要迅速判断和taget的差值是否出现过和结果返回的是下标位置。
class Solution {
public int[] twoSum(int[] nums, int target) {
//用数组记录要返回的下标位置
int res[]=new int[2];
if(nums == null||nums.length == 0){
return res;
}
//定义map结构
Map<Integer,Integer> map = new HashMap<>();
for(int i=0;i<nums.length;i++){
int temp=target-nums[i]; //定义temp表示和目标的差值
if(map.containsKey(temp)){ //如果满足条件就把下标放入数组中
res[0]=i;
res[1]=map.get(temp);
}
map.put(nums[i],i); //将元素的值和下标放入图,继续向后遍历
}
return res;
}
}
如果对哈希表数据结构不熟悉,这边推荐卡哥的网站,里面有文字讲解和视频。我也是跟着卡哥学习的。