242.有效的字母异位
题目描述
给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的字母异位词。
注意:若 s
和 t
中每个字符出现的次数都相同,则称 s
和 t
互为字母异位词。
题解
- 定义一个数组用来记录字符串s里字符出现的次数
- s.charAt(i)-'a'作为数组下标
- 再遍历字符串t,对映射到的数组值-1
- 最后遍历record数组,如果数组中有值不为0,说明字符串字母不相同
时间复杂度:O(m+n)
空间复杂度:O(1)
class Solution {
public boolean isAnagram(String s, String t) {
int[] record=new int[26]; //用数组记录字符串中字符出现的次数
for(int i=0;i<s.length();i++){
record[s.charAt(i)-'a']++;
}
for(int j=0;j<t.length();j++){
record[t.charAt(j)-'a']--; //如果出现同样的字符,数组大小减一
}
//如果数组中有不为0的数,说明两串字符不一样
for(int num:record){
if(num!=0) return false;
}
return true;
}
}
349.两个数组的交集
题目描述
给定两个数组 nums1
和 nums2
,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
题解
题解一:使用数组当做哈希表
缺点:浪费内存
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
int[] res=new int[1001];
int[] record=new int[1001];
int k=0;
for(int num:nums1){
record[num]=1;
}
for(int num:nums2){
if(record[num]==1){
res[k++]=num;
record[num]=0;
}
}
int[] res1=new int[k];
for(int i=0;i<k;i++){
res1[i]=res[i];
}
return res1;
}
}
题解二:
如果哈希值较少、特别分散、跨度非常大,使用数组会造成空间的极大浪费。
就需要考虑新的结构体: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];
}
//使用HashSet集合,不会存储重复元素
Set<Integer> set1= new HashSet<>();
Set<Integer> resSet= new HashSet<>();
for(int num:nums1){
set1.add(num);
}
for(int num:nums2){
if(set1.contains(num)){
resSet.add(num);
}
}
//将集合转化为数组
//方法一
return resSet.stream().mapToInt(x->x).toArray();
//方法二:重新申请数组
int[] res=new int[resSet.size()];
int i=0;
for(int num : resSet){
res[i++]=num;
}
return res;
}
}