344、反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
class Solution {
public void reverseString(char[] s) {
//我是瞎子,以为要把字符数组里的字符都弄成小写
int j=s.length-1;
char temp;
for(int i=0;i<s.length/2;i++){
//数组交换元素
temp=s[i];
s[i]=s[j];
s[j]=temp;
j--;
}
}
}
349、两个数组的交集
给定两个数组 nums1
和 nums2
,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
// int[] arr = set.stream().mapToInt(Integer::intValue).toArray(); //set直接转成数组
// int[] arr = list.stream().mapToInt(Integer::intValue).toArray(); //list直接转成数组
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Map<Integer,Integer>map=new HashMap<>();//不用map用list也可以
Set<Integer>set=new HashSet<>();
for(int i=0;i<nums1.length;i++){//获取nums1的值
map.put(nums1[i],i);
}
for(int i:nums2){
if(map.containsKey(i)){//判断map是否有nums的值
set.add(i);//去重
}
}
// int[] arr = set.stream().mapToInt(Integer::intValue).toArray(); //set直接转成数组
// int[] arr = list.stream().mapToInt(Integer::intValue).toArray(); //list直接转成数组
int []arr=new int[set.size()];
int j=0;
for(int i:set){
arr[j++]=i;
}
return arr;
}
}
350、两个数组的交集 II
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
注意:
1、remove有两个重载方法,如果括号里的是int类型,那么就是返回索引对应的值,如果括号不是int类型,那么就是删除这个值。
2、恰巧我们的值是int类型的,直接返回i 会被默认为返回索引i对应的值而报错,所以我们要将int转化成Integer
法一:
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
List<Integer>list1=new ArrayList<>();
List<Integer>list2=new ArrayList<>();
for(int i:nums1){
list1.add(i);
}
for(int i:nums2){
if(list1.contains(i)){
list2.add(i);
list1.remove(Integer.valueOf(i));
//remove有两个重载方法,如果括号里的是int类型,那么就是返回索引对应的值
//如果括号不是int类型,那么就是删除这个值。
//恰巧我们的值是int类型的,直接返回i 会被默认为返回索引i对应的值而报错,
//所以我们要将int i转化成Integer
}
}
int[]arr=new int[list2.size()];
int j=0;
for(int i:list2){
arr[j++]=i;
}
return arr;
}
}
法二:
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
Map<Integer, Integer> map = new HashMap<>();
List<Integer> list = new ArrayList<>();
// 将 nums1 出现的数值及频次放入映射中
for (int num : nums1) {
if(!map.containsKey(num)){
map.put(num,1);
}else{
map.put(num,map.get(num)+1);
}
}
for(int num:nums2){
//每次-1后,值有可能变成负数 而我们定义的值是出现元素的次数 所以要大于0
if(map.containsKey(num)&&map.get(num)>0){
list.add(num);
map.put(num,map.get(num)-1);
}
}
// for (int num : nums2) {
// // 获取映射中该数值出现的频次
// Integer count = map.get(num);
// if (count != null && count != 0) {
// list.add(num);
// // 注意每次匹配后,该数值的频次需要减 1(nums1 和 nums2 匹配的数值的频次要相同)
// map.put(num, --count);
// }
// }
int[] res = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
res[i] = list.get(i);
}
return res;
}
}
注意:
Map 是一种键-值对(key-value)集合,Map 集合中的每一个元素都包含一个键对象和一个值对象。其中,键对象不允许重复,而值对象可以重复。
如果Map的key重复了,那么会取最后一次添加这个重复的key为准。
如图:添加了4个键为1的元素,因为键重复了,所以会取最后一次为键为1的元素即:<1,3>
System.out.println(map.remove(2,5));//判断map集合中是否有一个元素满足<键=2,值=5>的。满足则返回true并删除这个元素
map.remove(1);//删除键为1的这个元素。