代码随想录Day4

LeetCode 349: 给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序.

 

 思路:

需要在输出结果中做去重操作,所以可以选择Set来操作。HashSet自带去重。

需要SetA来存放nums1,然后遍历nums2,判断nums2的每个元素是否存在于SetA中

代码:

复制代码
package com.dwj.LeetCode.HashList;

import java.util.HashSet;
import java.util.Set;

/**
 * 两数组相交,返回相交元素的集合,不含重复元素
 */
public class ArrayBanana {
    class Solution {
        public int[] intersection(int[] nums1, int[] nums2) {
            if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) {
                return new int[0];
            }
            Set<Integer> set1 = new HashSet<>();
            Set<Integer> resSet = new HashSet<>();
            //遍历数组1
            for (int i : nums1) {
                set1.add(i);
            }
            //遍历数组2的过程中判断哈希表中是否存在该元素
            for (int i : nums2) {
                if (set1.contains(i)) {
                    resSet.add(i);
                }
            }
            //将结果几何转为数组
            return resSet.stream().mapToInt(x -> x).toArray();
        }
    }
}
复制代码

 

LeetCode 1.  两数之和

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

 

思路:这一题,判断是否存在,想到可以使用哈希表的方法来做。首先遍历拿到一个数字,然后通过与目标值做减法,判断

这个数字之前是否出现过,如果出现过,返回两个数的下标。由于这一题需要存下标值和元素值,可以使用Map存储,特别

注意的是,map用key存放元素值比较合适,因为我们需要主要判断元素的值。

 

代码:

复制代码
package com.dwj.LeetCode.HashList;

import java.util.HashMap;
import java.util.Map;

public class TwoNumberPlus {
    public int[] twoSum(int[] nums, int target) {
        int[] res = new int[2];
        if(nums == null || nums.length == 0){
            return res;
        }
        Map<Integer, Integer> map = new HashMap<>();
        for(int i = 0; i < nums.length; i++){
            int temp = target - nums[i];
            if(map.containsKey(temp)){
                res[1] = i;
                res[0] = map.get(temp);
            }
            map.put(nums[i], i);
        }
        return res;
    }
}
复制代码

LeetCode202 快乐数

对快乐数的定义是:

「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为  1,那么这个数就是快乐数。

如果 n 是快乐数就返回 True ;不是,则返回 False 。

示例:

输入:19
输出:true
解释:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1

是一个把计算通过平方求和延续下去的过程

思路:

首先,判断是否存在,是否出现的问题,想到使用哈希表来做。此题是一个循环判断的问题,首要搞清楚,终止条件是什么?最终的和一直等于1

取每个数的操作可以通过取余和除来完成。要写一个方法来完成对每个数进行平方求和的操作,然后使用wile进行循环判断是否满足继续进行的条件。、

 

代码:

复制代码
package com.dwj.LeetCode.HashList;

import java.util.HashSet;
import java.util.Set;

public class HappyNumber {
    class Solution {
        public boolean isHappy(int n) {
            Set<Integer> record = new HashSet<>();
            while (n != 1 && !record.contains(n)) {
                record.add(n);
                n = getNextNumber(n);
            }
            return n == 1;
        }

        private int getNextNumber(int n) {
            int res = 0;
            while (n > 0) {
                int temp = n % 10;
                res += temp * temp;
                n = n / 10;
            }
            return res;
        }
    }
}
复制代码

 

 

总结:在题目给出描述,元素是否出现过,是否存在..... 要想到使用哈希列表来实现。

posted @   NobodyHero  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示