【Java】数组、集合、哈希表:刷题总结

● Java集合框架


对于数组类型,数组Array是地址连续的存储结构

int[] nums = {5,2,3,1,4};    //
//数组从小到大排序    {1,2,3,4,5}
Arrays.sort(nums);
//数组转化成字符串
return new String(chars);
System.out.println(Arrays.toString(nums));  //默认用逗号隔开,"1,2,3,4,5"
//将数组转化成list    [1,2,3,4,5]
List<Integer> list = Arrays.asList(nums);
//将arraylist和set等集合对象转化成数组,里面的元素由Integer转化为Int
int[] res = arraylist.stream().mapToInt(x -> x).toArray();
int[] res = arraylist.stream().mapToInt(Integer::intValue).toArray();

/*哈希数组常用:判断是否存在,数组大小有限*/
String s;
record[s.charAt(i)-'a']
for(int item:record)
if(item!=0)
…

对应题型:

  1. 是否是字母异位词字母有限,26个):字符在s里,record[s.charAt(i)-'a']++;字符在t里,record[s.charAt(i)-'a']--;最终判断:如果哈希数组存在不为0的值则说明构成“不完全相同”;
  2. 求交集(给了限制,1000以内):两个哈希数组,hash1,hash2,最终判断:如果对于j(1~1000)hash1[j]>0 &&hash2[j]>0(在两个数组都存在)则存入新的动态数组arraylist;
  3. 赎金信是否来源于杂志(字母有限,26个):如果哈希数组小于0则说明不来源于杂志。

对于List(序列),是不连续的存储结构

其中ArrayList(大小可变数组):是接口List的一个具体实现类

List<T> list = new ArrayList<>();
//添加
list.add(element);
list.add(index,element);
list.add(Arrays.asList(nums[i],nums[j],nums[left],nums[right]))    //四元组序列
//获取大小
int size = list.size();
//获得元素
T element = list.get(index);
//修改元素
list.set(index,new element);
//删除元素
list.remove(index/element);
//判断是否包含
if(list.contains(element))

/*三数之和*/
Arrays.sort();    //首先排序,所有重复数将连在一起
if(nums[i]>target){ //剪枝
    break;
}
if(i > 0 && nums[i] == nums[i-1]){  //对nums[i]去重(不是第一位且前一位重复)
    continue;
}
while(right > left && nums[left]==nums[left+1]) left++;    //对left和right去重
while(right > left && nums[right]==nums[right-1])   right--;

对应题型:

  1. 三数之和无限制,要求不重复的三元组):需要剪枝和去重的操作,较为复杂;返回的是所有元组
  2. 四数之和(同理):多了一层去重的操作。

对于Set类型:

其中HashList是其中的一个常用实现类,添加,修改,删除等操作同arraylist

Set<T> Set1 = new HashSet<>();
Set<T> Set2 = new HashSet<>();
//哈希集合中,通常Set1用于添加所有元素,Set2用于筛选交集
for(int item:nums1){
    Set1.add(item);
}
for(int i:nums2){
    if(Set1.contains(i)){
        Set2.add(i);
    }
}
//记得转化成数组类型后再返回
return Set2.stream().mapToInt(x->x).toArray();

对应题型:

  1. 求交集(无限制,是否存在):建立两个set,Set1用于添加所有元素,Set2用于筛选交集,最终返回Set2。求交集(元素本身)。
  2. 求快乐数(无限制,是否重复):由于不知道准确个数用set来判断,if(set.contains(sum))return false; else set.add(sum);求判断(是否重复)

对于Map类型,HashMap:

//key-value
Map<Integer,Integer> map1 = new HashMap<>();
//添加
map.put(k,v);
//获得元素
map.get(k)
map.getOrDefault(k,0)
//map大小
map.size()
//是否包含
map.containsValue(v)
map.containsKey(k)
//移除
map.remove(k)

/*两数之和*/
tmp = target - nums[i]
if(map.containsKey(tmp)) ->  xxxx
else ->  map.put(nums[i],i)
/*四数相加*/
map1.put(a+b,map1.getOrDefault(a+b,0)+1);

对应题型:

  1. 求一个数组中满足两数之和的两个下标:map是否存在元素对应的tmp,不存在则将元素加入map,在这种方法下不会出现元素重复的情况。把数值作为key,把下标作为value。
  2. 求满足四数相加的元组个数:从四个数组中取值,不存在元素重复。两数之和作为key,个数作为value。

总结:要看①是否范围有限②是否可能元素重复③题目要求什么

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值