一、LeetCode242. 有效的字母异位词
题目链接:242. 有效的字母异位词
创建一个长度为26的数组来表示小写字母a~z中的每个字母。
遍历第一个字符串,用数组记录出每个字符出现的次数,然后再减去第二个字符串中出现的字符,最后在检查数组中每个元素是否等于0,如果有不等于0的元素,说明两个字符串中,每个字符出现的次数不一样。
代码如下:
class Solution {
public boolean isAnagram(String s, String t) {
int[] arr = new int[26];
if(s.length() != t.length()) return false;
for(int i = 0; i < s.length(); i++) {
arr[s.charAt(i) - 'a']++;//记录s中每个单词出现的个数
}
for(int i = 0; i < t.length(); i++) {
arr[t.charAt(i) - 'a']--;//t中每个单词出现,数组中对应下标的元素减一
}
for(int i = 0; i < 26; i++) {
if(arr[i] != 0) return false;//如果数组中有一个元素不等于0,那么说明对应的单词在s和t中出现的次数不相等
}
return true;
}
}
时间复杂度O(n),空间复杂度O(1);
二、LeetCode349. 两个数组的交集
题目链接:349. 两个数组的交集
利用第一个数组中的元素创建一张哈希表,然后再用另外一张哈希表来收集第二个数组中出现在第一张哈希表的元素,那么第二张哈希表中的元素就是两个数组的交集,最后将第二张哈希表转变成数组返回。
代码如下:
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
if(nums1.length == 0 || nums2.length == 0) return new int[0];
Set<Integer> set = new HashSet<>();
Set<Integer> result = new HashSet<>();
for(int i : nums1) {
set.add(i);
}
for(int i : nums2) {
if(set.contains(i)) {
result.add(i);
}
}
int[] res = new int[result.size()];
int j = 0;
for(int i : result) {
res[j++] = i;
}
return res;
}
}
时间复杂度O(n)
三、LeetCode202. 快乐数
题目链接:202. 快乐数
创建一张可去重的哈希表来记录数n每次变化后的值。
用一个while循环来遍历这个数的每次变化。先判断一下这个数是否等于1,如果等于1说明这个数就是快乐数返回true。否则变化这个数,然后查询变化后的值是否出现在表中,如果出现了说明这个变化会无限循环下去,否则将变化后的值插入表中,用变化后的值替换这个数,然后再循环。
代码如下:
class Solution {
public boolean isHappy(int n) {
Set<Integer> set = new HashSet<Integer>();//用一个去重的哈希表来记录每次变化的数n
set.add(n);
int sum = 0;
while(true) {
if(n == 1) break;//如果这个数变化成1说明是快乐数
while(n != 0) {//计算这个数每个位置上的平方和
sum += (n % 10) * ( n % 10);
n /= 10;
}
if(set.contains(sum)) {//如果和出现在哈希表中,说明这个过程会无限循环,返回false
return false;
}
set.add(sum);//如果没出现,将和插入表中,将n变成sum
n = sum;
sum = 0;
}
return true;
}
}
四、LeetCode1. 两数之和
题目链接:1. 两数之和
创建一张Map表,记录nums[ i ] 和 i。
由两数之和等于target,在遍历数组的同时,查询表中是否有target - nums[i],如果有说明数组中有另外一个元素nums[j] 加上nums[i] 等于target,否则将nums[i] 和i 插入表中。
具体代码如下:
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map = new HashMap<>();//创建Map哈希表用来记录nums[i]和i。
int[] result = new int[2];//收集结果集
for(int i = 0; i < nums.length; i++) {
int tem = target - nums[i];
if(map.containsKey(tem)) {//在哈希表中查询target- nums[i]是否存在
result[0] = map.get(tem);
result[1] = i;
break;
}
map.put(nums[i], i);
}
return result;
}
}
总结
收集了一些HashSet和HashMap的常用方法:
HashSet:
boolean add(E e)
如果此 set 中尚未包含指定元素,则添加指定元素。
void clear()
从此 set 中移除所有元素。
boolean contains(Object o)
如果此 set 包含指定元素,则返回 true。
boolean isEmpty()
如果此 set 不包含任何元素,则返回 true。
boolean remove(Object o)
如果指定元素存在于此 set 中,则将其移除。
int size()
返回此 set 中的元素的数量(set 的容量)。
HashMap:
void clear()
从此映射中移除所有映射关系。
boolean containsKey(Object key)
如果此映射包含对于指定键的映射关系,则返回 true。
boolean containsValue(Object value)
如果此映射将一个或多个键映射到指定值,则返回 true。
V get(Object key)
返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回 null。
boolean isEmpty()
如果此映射不包含键-值映射关系,则返回 true。
V put(K key, V value)
在此映射中关联指定值与指定键。
V remove(Object key)
从此映射中移除指定键的映射关系(如果存在)。
int size()
返回此映射中的键-值映射关系数。