242、有效的字母异位词
思路:当需要快速判断一个元素是否存在于集合中时,首先想到哈希表。用一个数组来记录第一个字符串中各字符出现的个数,因为字符a到字符z的ASCII是26个连续的数值,所以字符a映射为下标0,相应的字符z映射为下标25。利用对应字符的ASCII值减去'a'的ASCII值便可以实现上述的映射。再遍历第二个字符串来对数组中的元素进行操作,最后通过遍历数组中的元素来确定:若其中有元素不等于0则说明两个字符串不是有效的字母异位词。
class Solution {
public boolean isAnagram(String s, String t) {
int[] array = new int[26];
for(int i = 0; i < s.length(); i++) {
array[s.charAt(i) - 'a']++;
}
for(int i = 0; i < t.length(); i++) {
array[t.charAt(i) - 'a']--;
}
for(int count : array) {
if(count != 0) {
return false;
}
}
return true;
}
}
小结:写代码时出现以下问题
- 最开始对a-z做映射时,查阅'a'的ASCII值,其实不需要知道其对应的ASCII值,只需要求一个相对值便可。
本题主要利用数组作为哈希表的思想来快速判断一个对应元素是否存在于数组中。
349、两个数组的交集
思路:由于数组中会存在重复的元素,故想到利用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];
}
Set<Integer> set1 = new HashSet();
Set<Integer> resSet = new HashSet();
for(int i = 0; i < nums1.length; i++) {
set1.add(nums1[i]);
}
for(int i = 0; i < nums2.length; i++) {
if(set1.contains(nums2[i])) {
resSet.add(nums2[i]);
}
}
return resSet.stream().mapToInt(x -> x).toArray();
}
}
小结:写代码时出现以下问题
- 对于数组不存在或数组存在而长度为0的情况没有考虑,导致代码的健壮性不够好
- 对于Java中关于Set的内置函数的使用不够熟练
- 不会将Set如何转换为数组
本题主要利用Set作为哈希表的思想来快速判断数组中对应元素是否存在于集合中。
202、快乐数
思路:该题和上一题类似,只是套了一个快乐数的壳子。
class Solution {
public boolean isHappy(int n) {
Set record = new HashSet();
while(n != 1 && !record.contains(n)) {
record.add(n);
n = getNextNumber(n);
}
return n == 1;
}
private int getNextNumber(int n) {
int res = 0;
while(n > 0) {
int temp = n % 10;
res += temp * temp;
n = n / 10;
}
return res;
}
}
小结:写代码时出现以下问题
- 对于给定任意数,将其转化为各个位上的数的平方之后的操作不够熟悉(从左到右通过取余来取最左边的数,然后通过除法来向右移动)
- 对于while中循环条件的判断不完善
- 对于返回值的返回形式考虑不完善,n == 1不但可以返回n=1时的结果,还可以返回除此外的任意情况,故不需要特别地处理n=1的情况。
1、两数之和
思路:需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,而某元素是否遍历过,由此可以想到哈希表。而目的是返回对应值的下标,故可以考虑使用Map。将数组中元素作为键,对应的下标作为值。在数组遍历的过程中,利用target-nums[i]作为键来查找Map中是否有对应的值。
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap();
int[] arr = new int[2];
if(nums == null || nums.length == 0) {
return arr;
}
for(int i = 0; i < nums.length; i++) {
if(map.containsKey(target - nums[i])) {
arr[0] = i;
arr[1] = map.get(target - nums[i]);
break;
}
map.put(nums[i], i);
}
return arr;
}
}
小结:写代码时出现以下问题
- 对于数组不存在或数组存在但长度为0的情况没有考虑
- 对于Java中Map的函数用法不够熟练,例如可以通过containsKey()和containsValue()分别来查询是否包含对应的键和对应的值