有效的字母异位词
242. 有效的字母异位词
当需要判断某个数是否在集合内时,使用哈希方法比较简单,常见的哈希方法主要有数组、set和map,要分情况使用,数组一般用于数据量较小时,比如本题一共只有26个字母,那么只需要创建26大小的数组即可,如果使用map就会增加复杂度。另外set一般用于无序且不重复的情况,map用于需要存储key:value的情况
class Solution {
public boolean isAnagram(String s, String t) {
int[] arr = new int[26];
//toCharArray返回字符串的字符数组
for (char c : s.toCharArray()) {
//字符相减得到的是ASCII码的差
arr[c - 'a']++;
}
for (char c : t.toCharArray()) {
arr[c - 'a']--;
}
for (int a : arr) {
if (a != 0) {
return false;
}
}
return true;
}
}
两个数组的交集
349. 两个数组的交集
本题要求结果不重复,用set比较适用,同时又是判断元素是否在集合中,解决这种问题的步骤就是先创建一个set把数据存入,然后再遍历另一个集合判断元素
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set = new HashSet();
for (int num : nums1) {
set.add(num);
}
Set<Integer> resultSet = new HashSet();
for (int num : nums2) {
if (set.contains(num)) {
resultSet.add(num);
}
}
int[] resultArr = new int[resultSet.size()];
int j = 0;
for (int i : resultSet) {
resultArr[j++] = i;
}
return resultArr;
}
}
快乐数
202. 快乐数
本题主要能想到如果有重复值出现,那么就要返回false,是否有重复值问题就要用到hashset,另外本题有两个难点,一个是快乐数的计算,步骤是先取余再缩小10倍,这样一直循环,另一个是循环条件的判断,当n=1或者set中包含了该元素,循环才会停止
class Solution {
public boolean isHappy(int n) {
Set<Integer> set = new HashSet();
while (n != 1 && !set.contains(n)) {
set.add(n);
n = getNum(n);
}
return n == 1;
}
private int getNum(int n) {
int sum = 0;
int tmp;
while (n != 0) {
tmp = n % 10;
sum += tmp * tmp;
n = n / 10;
}
return sum;
}
}
两数之和
1.两数之和
本题适用hashmap,key存元素,value存下标,每次遍历到元素时,需要先判断,然后再存
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map = new HashMap();
int[] result = new int[2];
for (int i=0; i<nums.length; i++) {
int tmp = target - nums[i];
if (map.containsKey(tmp)) {
result[0] = i;
result[1] = map.get(tmp);
}
map.put(nums[i], i);
}
return result;
}
}