● 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)
…
对应题型:
- 是否是字母异位词(字母有限,26个):字符在s里,record[s.charAt(i)-'a']++;字符在t里,record[s.charAt(i)-'a']--;最终判断:如果哈希数组存在不为0的值则说明构成“不完全相同”;
- 求交集(给了限制,1000以内):两个哈希数组,hash1,hash2,最终判断:如果对于j(1~1000)hash1[j]>0 &&hash2[j]>0(在两个数组都存在)则存入新的动态数组arraylist;
- 赎金信是否来源于杂志(字母有限,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--;
对应题型:
- 三数之和(无限制,要求不重复的三元组):需要剪枝和去重的操作,较为复杂;返回的是所有元组。
- 四数之和(同理):多了一层去重的操作。
对于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();
对应题型:
- 求交集(无限制,是否存在):建立两个set,Set1用于添加所有元素,Set2用于筛选交集,最终返回Set2。求交集(元素本身)。
- 求快乐数(无限制,是否重复):由于不知道准确个数用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);
对应题型:
- 求一个数组中满足两数之和的两个下标:map是否存在元素对应的tmp,不存在则将元素加入map,在这种方法下不会出现元素重复的情况。把数值作为key,把下标作为value。
- 求满足四数相加的元组个数:从四个数组中取值,不存在元素重复。两数之和作为key,个数作为value。
总结:要看①是否范围有限②是否可能元素重复③题目要求什么