目录
题目链接:242. 有效的字母异位词 - 力扣(LeetCode)
题目链接:349. 两个数组的交集 - 力扣(LeetCode)
题目链接:242. 有效的字母异位词 - 力扣(LeetCode)
作者思考:
这种查找是否包含相同字符的,可以用两层for循环暴力遍历出结果,可是时间复杂度太高了,在LeetCode上很有可能过不去。那有没有简单方法呢?哈希表。那哈希表能解决什么问题呢?哈希表一般用来快速判断一个元素是否出现在集合中。这时考虑用哈希表。
本道题是需要我们判断两个字符串是否为字母异位词。那也就是说我们可以定义一个哈希表用于存储26个字母,然后统计每个索引值出现的次数,即可求出结果;那么选择哪一个哈希表呢?因为我们需要存储的数据量很小,且需要经常性的查询,故我们选择数组。
class Solution {
public boolean isAnagram(String s, String t) {
int[] record = new int[26];//定义一个长度为26的数组存放字符
for (int i = 0; i < s.length(); i++) {
record[s.charAt(i) - 'a']++;//读取字符串中的字符 - '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. 两个数组的交集 - 力扣(LeetCode)
作者思考:
根据题目要求 核心是:输出结果中的每个元素一定是惟一的。唯一值,我们可以考虑set集合,set集合可以帮助我们去重
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
if(nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) {
return new int[0];
}//判断 数组是否为空 再判断是否长度为0
Set<Integer> set1 = new HashSet<>();
Set<Integer> resSet = new HashSet<>();
for (int i : nums1 ) {
set1.add(i);//set1 包含的元素是nums1去重后的元素
}
for (int i : nums2) {
if (set1.contains(i)) {
resSet.add(i);//将重复的元素记录到集合中
}
}
//定义一个数组来接收集合中的元素
int[] arr = new int[resSet.size()];
int j = 0;
for (int i : resSet) {
arr[j++] = i;
}
return arr;
}
}
题目链接:202. 快乐数 - 力扣(LeetCode)
作者思考:
理清题目后,我们大概可以分成两个难点①:一个数循环拆分各位的平方和 ;②:如何找到这个过程中出现死循环的数,退出这个循环
解决第一个难点,我们只需要再定义一个函数吗,然后在查找快乐数的过程中调用
解决第二个难点,寻找重复出现的数,我们想要数组不出现重复数,可以使用set集合帮助去重
class Solution {
public boolean isHappy(int n) {
Set<Integer> set = new HashSet<>();//加入set集合的目的是为了去重
while (n != 1 && !set.contains(n)) {//判断该数字经过循环后是否为1,且集合中有且只有一个该数字
set.add(n);//满足条件加入集合
n = getSum(n);
}
return n == 1;
}
public int getSum(int n) {
int sum = 0;
while (n > 0) {
int tmp = n % 10;//取个位
n = n / 10;//十位变个位 , 其他位相应右移一位
sum += tmp * tmp;
}
return sum;
}
}
题目链接:1. 两数之和 - 力扣(LeetCode)
作者思考:
温馨提示不要晚上看算法会蒙圈hh。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
当target = 9时,我们遍历到集合中第一个元素2时,我们可以查找之前遍历过的集合中有没有 和2相加 等于 目标target = 9的元素。按照上述思路,我们需要用一个集合存放之前遍历过的元素,一个用于存放当前的索引。之前set list 集合都是用于存放单个含义的元素。不满足题目的要求,这时我们刚好可以用map集合(key - value)以键值对的形式存储数据,且可以快速查找目标key是否存在map集合中。
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] res = new int[2];//存储结果
if(nums == null && nums.length == 0) {//注意判断顺序 顺序出错容易造成空指针异常
return res;
}
Map<Integer, Integer> map = new HashMap<>();//定义一个map集合 key-元素 value-存放索引
for (int i = 0; i < nums.length; i++) {
int s = target - nums[i];
if (map.containsKey(s)) {
res[0] = map.get(s);//因为是查找之前遍历过的元素 故索引为0
res[1] = i;
break;
}
map.put(nums[i], i); 如果没找到匹配对,就把访问过的元素和下标加入到map中
}
return res;
}
}