lc242:有效的字母异位词(简单)
题目描述:
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
class Solution {
public boolean isAnagram(String s, String t) {
int[] hash = new int[26];
for (int i = 0; i < 26; i++){
hash[i] = 0;
}
for (int i = 0; i < s.length(); i++) {
int pos = s.charAt(i) - 'a';
hash[pos]++;
}
for (int i = 0; i < t.length(); i++) {
int pos = t.charAt(i) - 'a';
hash[pos]--;
}
for (int i = 0; i < 26; i++) {
if(hash[i] != 0) {
return false;
}
}
return true;
}
}
解题心得:
首先这道题如果告诉你使用哈希,并且使用数组的数据结构,可能你就豁然开朗了。
1)是否符合大海捞针的条件,我们要去对比每一个字符串t中的字符是否在字符串s中,相当于我们需要做t.length()次大海捞针的操作。
2)选定那种数据结构?------ 目前还没有想到为何要使用数组的数据结构,后续需要思考完善。
3)选取什么样的哈希表?哈希表的选取首先的要素就是要能把所有元素通过映射到哈希表中去,这里我们选取一个长度为26的数组,因为字符串中的元素都是小写字母,26个小写字母的ASSCI值是26个连续的值,所以我们可以将它们分别映射到0-25的数值上,正好对应上数组的下标。
4)注意:使用数组来做哈希的题目,是因为题目都限制了数值的大小。题目没有限制数值的大小,就无法使用数组来做哈希表了。
lc349:两个数组的交集
题目描述:
给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
if (nums1 == null || nums2 == null) {
return new int[0];
}
Set<Integer> set1 = new HashSet<>();
Set<Integer> resSet = new HashSet<>();
// 遍历数组1
for (int i : nums1) {
set1.add(i);
}
// 遍历数组2过程中判断哈尔表中是否存在该元素
for (int i : nums2) {
if (set1.contains(i)) {
resSet.add(i);
}
}
int[] resArr = new int[resSet.size()];
int index = 0;
// 将结果集合转为数组
for (int i : resSet) {
resArr[index++] = i;
}
return resArr;
}
}
解题思路:
解题思路全靠题解,哈哈哈!!!
注意:使用数组来做哈希的题目,是因为题目都限制了数值的大小。题目没有限制数值的大小,就无法使用数组来做哈希表了。
此题就是明显的没有确定数组长度,只用用set和map的数据结构。这里选择的是set,为什么不用map,也是后续再讨论。
首先对set的用法还不太熟练,希望通过这道题加深对set的使用。
1)set的定义:Set set1 = new HashSet<>();
2)往set中添加数据。
3)查看某个数据是否在set中。
4)set集合转为数组。
5)遍历set和遍历nums数组的方法。
链接: lc202:快乐数(简单)
题目描述:
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
class Solution {
public boolean isHappy(int num) {
return testNum(num, 0, new HashSet<Integer>());
}
private static boolean testNum(int num, int sum, HashSet<Integer> set) {
String sNum = String.valueOf(num);
char[] chars = sNum.toCharArray();
for (int i = 0; i < sNum.length(); i++) {
Integer n = Integer.valueOf(String.valueOf(chars[i]));
sum += n * n;
}
boolean isAdd = set.add(sum);
if (!isAdd) return false;
if (sum == 1) return true;
return testNum(sum, 0, set);
}
}
此题虽然被定义为简单题,但是我真的觉得不那么简单啊!!!
这道题有很多自己不熟练的操作。
对于该题,首先用到了递归的思想,但是我们需要仔细分析三个方面:
1)终止条件:再次得到了一个之前重复的数,证明次数不快乐了,陷入了死循环,快乐不起来,得到了1,那么该数就是快乐数了,也就结束了。
2)返回值,如果我们没证明到快乐也没证明到不快乐,我们需要返回那个计算后(操作)的数。
3)单次过程,也就是求一个数进行判断是否快乐的操作过程。
在我们判断是否得到一个重复的数时,也就是判断是否陷入了死循环,我们可以借助set,哈希表结构的set集合不能又重复元素,如果向表中添加一个表中已经存在的数据,那么会返回false。