1.有效的字母异位词
public boolean isAnagram(String s, String t) {
//创建一个数组用于记录不同的字母出现的次数
int[] ints = new int[26];
//如果s中出现一个字母,那么相应的单词下标就加一
for (int i = 0; i < s.length(); i++) {
ints[s.charAt(i) - 'a']++;
}
//如果t中出现一个字母,那么相应的单词下标就减一
for (int i = 0; i < t.length(); i++) {
ints[t.charAt(i) - 'a']--;
}
//若最后的数组每个位置都是0,那么返回true,否则返回false
for (int anInt : ints) {
if (anInt != 0) {
return false;
}
}
return true;
}
心得体会:
1.数组就是一张哈希表。哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素。
2.一般哈希表都是用来快速判断一个元素是否出现集合里。当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。
2.两个数组的交集
//两个数组中,任意一个数组为null,或者length为0,都说明没有交集,返回空数组
if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) {
return new int[0];
}
HashSet<Integer> hashSet = new HashSet<>();
HashSet<Integer> res = new HashSet<>();
//将nums1中的数放入hashset中
for (int i = 0; i < nums1.length; i++) {
hashSet.add(nums1[i]);
}
for (int i = 0; i < nums2.length; i++) {
//如何有重复的部分,则将这个数字放入res中
if (hashSet.contains(nums2[i])) {
res.add(nums2[i]);
}
}
int[] ints = new int[res.size()];
int i = 0;
for (int re : res) {
ints[i++] = re;
}
return ints;
心得体会:
这道题用HashSet很方便,可以自动去重
3. 快乐数
public boolean isHappy(int n) {
//建立一个hashset用于记录出现过的数字
Set<Integer> record = new HashSet<>();
//得到一个数各个位置上平方之后的和
n = getNextNumber(n);
//当n不为1且record没有出现重复的数时进行循环
while (n != 1 && !record.contains(n)) {
//将结果记录下来
record.add(n);
n = getNextNumber(n);
}
return 1 == n;
}
private int getNextNumber(int n) {
int res = 0;
while (n != 0) {
//得到末尾的数
int num = n % 10;
res += num * num;
//整数相除的结果也为整数
n = n / 10;
}
return res;
}
4. 两数之和
//key为对应索引的值,value为数组下标索引
HashMap<Integer, Integer> record = new HashMap<>();
int[] res = new int[2];
if (nums == null || nums.length == 0) {
return res;
}
for (int i = 0; i < nums.length; i++) {
int temp = target - nums[i];
//查看已经遍历过的值中有无符合条件的
if (record.containsKey(temp)) {
res[0] = i;
res[1] = record.get(temp);
break;
}
record.put(nums[i], i);
}
return res;