一、有效的字母异位词(LeetCode242)
通过哈希表数组的形式将第一个字符串遍历到表中,对出现的字母做计数;然后遍历另一个字符串去表中查询,若有相同字母则计数减一;最后遍历hash数组,如果有的元素不为零0,说明字符串s和t一定是谁多了字符或者谁少了字符;若所有元素都为零0,说明字符串s和t是字母异位词。
/**
* 字典解法
* 时间复杂度O(m+n) 空间复杂度O(1)
*/
class Solution {
public boolean isAnagram(String s, String t) {
int[] hash = new int[26];
for(int i = 0;i < s.length();i++){
hash[s.charAt(i) - 'a']++; //并不需要记住字符a的ASCII,只要求出一个相对数值就可以了
}
for(int j = 0;j < t.length();j++){
hash[t.charAt(j) - 'a']--;
}
for(int i = 0;i < 26;i++){
if(hash[i] != 0){ //hash数组如果有的元素不为零0,说明字符串s和t一定是谁多了字符或者谁少了字符。
return false;
}
}
return true; //hash数组所有元素都为零0,说明字符串s和t是字母异位词
}
}
二、两个数组的交集(LeetCode349)
通过hash表set集合的形式把数组1放进去,之后遍历数组2并contains作判断set中是否有相同元素,若有则吧相同的元素存在另一哈希表set1中,最后将结果转化为数组输出。(输出用到了stream流,mapToInt拿到Integer流对象,之后toArray终止流就可以返回int数组)
import java.util.HashSet;
import java.util.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> set = new HashSet<>();
Set<Integer> result = new HashSet<>();
//把数组1的值放进set中
for(int num1 : nums1){
set.add(num1);
}
//遍历数组2并判断set中是否存在相同元素
for(int num2 : nums2){
if(set.contains(num2)){
result.add(num2);
}
}
//IntStream intStream = result.stream().mapToInt(x -> x);//x->x是lamdam语法不对元素做处理
//return intStream.toArray();
return result.stream().mapToInt(x -> x).toArray(); //将结果几何转为数组
//通过stream()方法拿到流对象,mapToInt拿到Int流对象,就可以toArray返回int数组了
//如果这里是String泛型要转为int数组的话,就要调用Integer.parseInt()方法,lambda写法:mapToInt(Integer::parseInt)
}
}
三、快乐数(LeetCode202)
通过哈希表set形式将不等于1和哈希表中不存在的书放入表中,并构造函数求符合条件的数,在函数中要通过%10取余取数的最低位,/10取数的最高位。
class Solution {
public boolean isHappy(int n) {
Set<Integer> hash = new HashSet<>();
while(n != 1 && !hash.contains(n)){
hash.add(n);
n = getNextNumber(n);
}
return n == 1;
}
private int getNextNumber(int n){
int sum = 0;
while(n > 0){
int tem = n % 10; // 取最低位,例n=19,tem=9
sum += (int)(Math.pow(tem,2));
n = n / 10; // 取最高位,例n=19,此时/10后n=1
}
return sum;
}
}
四、两数之和(LeetCode1)
创建一个长度为2的数组存放符合条件的两位数的下标,因为要存放数值和它的下标所以创建一个map形式的哈希表;遍历当前元素,并在map(刚开始时的map是空的)中寻找是否有匹配的key,如果没找到匹配对,就把访问过的元素和下标加入到map中。
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] res = new int[2];
if(nums == null || nums.length == 0){
return res;
}
Map<Integer,Integer> map = new HashMap<>();
for(int i = 0;i < nums.length;i++){
int tem = target - nums[i]; // 遍历当前元素,并在map中寻找是否有匹配的key
if(map.containsKey(tem)){ //此时的map还未存值,所以以下的res数组下标是倒叙的
res[1] = i;
res[0] = map.get(tem);
}
map.put(nums[i], i); // 如果没找到匹配对,就把访问过的元素和下标加入到map中
}
return res;
}
}