Leetcode242:有效的字母异位词(哈希-数组)
题目链接:https://leetcode.cn/problems/valid-anagram/description/
题目分析:题干异此等判定的本质就是,组成字母及出现次数均相同即可判定为true;例如abcd 与 abcd 也算作异位词;所以我们只要判定两个字符串中字母(题干说只有小写字母)出现的频次是否相同;
思路:根据carl视频说的我们使用数组实现哈希方法去解决这道题
Java实现代码:
class Solution {
public boolean isAnagram(String s, String t) {
if(s.length() != t.length()){
return false;
}
int[] record = new int[26];
int L=s.length();
for(int i = 0;i <L;i++){
record[s.charAt(i)-'a']++;
}
for(int i = 0;i <L;i++){
record[t.charAt(i)-'a']--;
}
for(int count:record){
if(count!=0) {
return false;
}
}
return true;
}
}
代码实现逻辑大致为:
- 先判断字符串长度是否一致,不一致直接false
- recode用于存储26个字母出现频次 对应哈希方法:s.charAt(i)-'a' ;即a--0;b-1;......;z--25;
- 字符串一如果出现对应位置值++;字符串二如果出现对应位置值--;
- 所以两个字符串如果出现字母及频次相同,则数组所有值会被归零;遍历record,如果不为零直接return;
- 循环结束 即字母与频次均相同 return true;
Leetcode349:两个数组的交集(哈希-set、数组)
题目链接:https://leetcode.cn/problems/intersection-of-two-arrays/description/
java实现:HashSet
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
//判断是否有空,任意空 交集空
if(nums1 == null ||nums1.length == 0 || nums2 == null ||nums2.length == 0){
return new int[0];
}
//建 HashSet -set1存nums1结果;-resultSet 存交集
Set<Integer> set1 = new HashSet<>();
Set<Integer> resultSet = new HashSet<>();
//遍历添加,HashSet自动去重
for(int i :nums1){
set1.add(i);
}
//遍历 nums2 如果set1存在,添加到resultSet
for(int j:nums2){
if(set1.contains(j)){
resultSet.add(j);
}
}
//使用流处理将hashset->数组
return resultSet.stream().mapToInt(x->x).toArray();
}
}
java实现:哈希数组---与上一题思想一致
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
//初始化创建两个int[1002]数组
int[] hash1 = new int[1002];
int[] hash2 = new int[1002];
//存储两个数组结果
for(int i : nums1)
hash1[i]++;
for(int i : nums2)
hash2[i]++;
//创建List用于保存结果
List<Integer> resList = new ArrayList<>();
for(int i = 0; i < 1002; i++)
if(hash1[i] > 0 && hash2[i] > 0)
resList.add(i);
//由List->int[]
int index = 0;
int res[] = new int[resList.size()];
for(int i : resList)
res[index++] = i;
return res;
}
}
Leetcode202:快乐数
题目链接:https://leetcode.cn/problems/happy-number/description/
Hash数组在循环过程中进行存储,循环条件是数值不等于1,存储时如果HashSet存在,则不为快乐数(因为存在会陷入死循环),如果不存在加入此数并进行数值更新计算并进入下一轮判断;
class Solution {
public boolean isHappy(int n) {
Set<Integer> record = new HashSet<>();
while(n != 1){
if(record.contains(n)){
return false;
}else{
record.add(n);
}
n = getNextValue(n);
}
return true;
}
purivate int getNextValue(int n){
int sum = 0;
while(n != 0){
sum += Math.pow(n%10,2);
n /= 10;
}
return sum;
}
}
Leetcode1:两数之和
题目链接:
分析:哈希法的使用
- 需求1.我们需要遍历一个元素时,需要查找target-nums[i] 是否过去遍历过
- 需求2.如果找到,我们也需要得到对应的下表;所以用键值对形式存放最为合适;
- 即使用HashMap Key:nums[i] ,value : i;(因为是找对应的元素是否遍历出现过)
Java代码:
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] result = new int[2];
HashMap<Integer,Integer> record = new HashMap<>();
for(int i =0;i<nums.length;i++){
int seeknumber = target-nums[i];
if(record.containsKey(seeknumber)){
result[0] = record.get(seeknumber);
result[1] = i;
return result;
}
record.put(nums[i],i);
}
return result;
}
}
总结:哈希
- 哈希表适用于:给你一个元素,判断是否在集合内出现过
- map形式适合键值对;
- set: (a)数值大的时候适用 (b)数据少但是非常分散
- 数组 数值小的时候适用