力扣Day20(除夕快乐)

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的这个元素。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值