代码随想录第六天|哈希表

news/2024/7/7 19:08:05

代码随想录第六天

    • Leetcode 242 有效的字母异位词
    • Leetcode 349 两个数组的交集
    • Leetcode 202 快乐数
    • Leetcode 1 两数之和

Leetcode 242 有效的字母异位词

题目链接: 有效的字母异位词
自己的思路:自己没想到,多练!

正确思路:定义一个长度为26的数组res,用于存放每个字符出现的次数,因为字符串s和t里面都是小写字母,所以长度是26。首先如果两个字符串长度不相等的话,字符串出现的次数一定不同,所以返回false;当长度相同的时候,遍历字符串s和t,s字符串用于字符个数的++,t字符串用于字符个数的–,然后再遍历数组res,如果有某个字符的个数不等于0,则返回false,因为如果字符个数相等的话,最后一定是一个全0的数组,如果没有返回false,则返回true,代表字符个数相等。

代码:

class Solution {
    public boolean isAnagram(String s, String t) {
        //如果两个字符串长度不相等的话,直接返回false
        if (s.length()!=t.length()) return false;
        //因为都为小写字母,所以我们定义一个长度为26的字母来存放每个字符出现的次数
        int[] res = new int[26];
        //遍历两个字符串,s字符串用于++,t字符串用于--
        for (int i = 0;i<s.length();i++){
            res[s.charAt(i)-'a']++;
            res[t.charAt(i)-'a']--;
        }
        //遍历结果数组,如果有某个字符最后对应的值不等于0,说明某个字符出现的次数不相同
        for (int i = 0;i<26;i++){
            if (res[i]!=0) return false;
        }
        return true;
    }
}

复杂度分析
时间复杂度: O ( n ) \mathcal{O}(n) O(n)
空间复杂度: O ( 1 ) \mathcal{O}(1) O(1)

Leetcode 349 两个数组的交集

题目链接: 两个数组的交集
自己的思路:没想到,多练!!
正确思路:因为最后存放的数据是唯一,首先一定要想到Set来处理;因为要求两个数组的交集,而且唯一,那么最后的数据首先用一个Set来处理,可以先定义两个Set:set和resset,set用于遍历nums1,存放nums1中的数(不重复),然后再遍历nums2,如果说nums2中某个数在set中存在,那么加入到resset中,那么最后resset中存在的就是两个数组的交集(不重复)。最后再把Set转化成数组即可,方法二必须掌握,方法一根据时间来掌握。

代码:

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        //如果有某个为空,则直接返回空数组
        if (nums1==null||nums2==null) return new int[0];
        //定义两个Set,一个用于存放nums1里面的数(不重复)
        //另一个存放结果数组
        Set<Integer> set = new HashSet<>();
        Set<Integer> resset = new HashSet<>();
        for (int num1:nums1){
            set.add(num1);
        }

        //如果set里面包括num2,则加入到结果Set中
        for (int num2:nums2){
            if (set.contains(num2)){
                resset.add(num2);
            }
        }
        //转换为数组
        //方法一:
        return resset.stream().mapToInt(x -> x).toArray(); 

        //方法二:
        // int index = 0;
        // int[] res = new int[resset.size()];
        // for (int num:resset){
        //     res[index] = num;
        //     index++;
        // }
        // return res;

    }
}

复杂度分析
时间复杂度: O ( m + n ) \mathcal{O}(m+n) O(m+n)
空间复杂度: O ( m + n ) \mathcal{O}(m+n) O(m+n)

Leetcode 202 快乐数

题目链接: 快乐数
自己的思路:分析问题本质。快乐数是重复将该数替换为它每个位置上的数字的平方和,如果说中间存在了重复的元素,那么一定不是快乐数,因为会一直循环下去;如果说出现了,则为快乐数!

正确思路:哈希表
代码:

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> set = new HashSet<>();
        //定义一个临时变量作为getsum的输入参数
        int m;
        //定义一个flag,如果flag为false则说明出现了重复的数
        boolean flag;
        while(true){
            m = n;
            n = getsum(m);
            //如果n之前存在于set中,则flag为flase,否则为true
            flag = set.add(n);
            if (!flag) return false;
            //如果包含1,则返回true
            if (set.contains(1)) return true;
        }
    }

    //计算每个位置的平方和
    public int getsum(int n){
        int sum = 0;
        while(n!=0){
            sum += (n%10)*(n%10);
            n /= 10;
        }
        return sum;
    }
}

复杂度分析
不知道怎么算时间复杂度
空间复杂度: O ( 1 ) \mathcal{O}(1) O(1)

Leetcode 1 两数之和

题目链接: 两数之和
自己的思路:这道题目的是为了找出和为target的两个数,我们可以遍历整个数组,使用一个Map来存放之前遍历过的数组的值和索引,当遍历到nums[i]的时候,去Map中寻找有没有target-nums[i]的值,如果有的话,直接返回两个索引即可,如果没有,则把当前的值nums[i]和i放入Map中,直到找到和为target的两个数为止。
正确思路:哈希表

代码:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        //定义一个map,key用于存放数组中的值,value用于存放数组中的值的索引
        Map<Integer,Integer> map = new HashMap<>();
        for (int i =0;i<nums.length;i++){
            //如果map包含target-nums[i],因为target-nums[i]+nums[i]=target
            //直接返回索引数组
            if (map.containsKey(target-nums[i]))  return new int[]{map.get(target-nums[i]),i};
            else{
                //如果不包含的话把这对entry加入到map中
                map.put(nums[i],i);
            }
        }
        //随便返回一个数组
        return new int[2];
    }
}

复杂度分析
时间复杂度: O ( n ) \mathcal{O}(n) O(n)
空间复杂度: O ( n ) \mathcal{O}(n) O(n)


http://lihuaxi.xjx100.cn/news/1305409.html

相关文章

FastDDS 源码剖析:FastDDS 概述

目录 FastDDS 介绍 什么是 FastDDS&#xff1a; 为什么使用 FastDDS&#xff1a; 如何使用 FastDDS&#xff1a; FastDDS 的缺点 FastDDS 介绍 FastDDS 是一个高性能、可扩展的开源实时传输层协议&#xff08;RTPS&#xff09;实现&#xff0c;由 eProsima 公司开发。它遵…

springboot整合shiro实现认证和授权功能改进

目录 解决问题一 解决问题二 新的问题 第一步&#xff1a;添加依赖 第二步&#xff1a;添加redis配置类 第三步&#xff1a;创建redis工具类 第四步&#xff1a;创建用于操作用户权限的redis仓库 第五步&#xff1a;保存用户权限到redis 上一篇文章springboot整合shiro…

电池包通信协议 网上找的

系统通讯协议 版本&#xff1a;V09 日期&#xff1a;2022-12-06 1、声明 此通讯协议针对普通串口通信项目&#xff0c;总体规划和控制规则符合《电池包/控制器/充电器 PCBA 方案》。 2、通讯协议 2.1 通用规则 通讯接口采用非隔离的半双工 UART&#xff08;异步串行收发…

第七章 版本控制器——git

第七章 版本控制器——git 一、git的历史二、git的特点与发展1、git的特点2、git与github 二、git的安装与注册1、git的安装2、git的使用&#xff08;1&#xff09;github注册&#xff08;2&#xff09;创建远端仓库&#xff08;3&#xff09;将远端仓库镜像复制到本地仓库指令…

机器学习-特征选择:如何使用相关性分析精确选择最佳特征?

一、引言 「特征选择」在机器学习中发挥着重要的作用&#xff0c;它的目标是从众多可用特征中挑选出最具预测能力的特征子集&#xff0c;以提高模型性能和泛化能力。然而&#xff0c;由于现实中的数据集通常具有大量特征和复杂的相关性&#xff0c;特征选择变得非常具有挑战性。…

水利三类人员专职安全生产管理人员c证安全生产法律法规考试题库

​本题库是根据最新考试大纲要求&#xff0c;结合近年来考试真题的重难点进行汇编整理组成的全真模拟试题&#xff0c;考生们可以进行专项训练&#xff0c;查漏补缺巩固知识点。本题库对热点考题和重难点题目都进行了仔细的整理和编辑&#xff0c;相信考生在经过了针对性的刷题…

gnuplot 命令行绘图工具命令

gnuplot命令行绘图工具命令 绘图示例预览 gnuplot工具非常强大&#xff0c;可以在命令行进行曲线绘图&#xff0c;当然也可以在UI界面绘图。 绘图命令&#xff1a; gnuplot> plot test.csv u ($0):1 w lp t c1, test.csv u ($0):2 w lp t c2绘图效果&#xff1a; 数据文…

@Transaction事务导致的mysql连接耗尽源码分析

背景&#xff1a; Transaction注解是我们在日常的写代码过程中最常使用的事务注解了&#xff0c;本文就从spring源码的角度解析下这个注解的执行过程&#xff0c;以便分析为什么使用事务比正常的单sql执行更容易导致连接池耗尽 源码追踪&#xff1a; 本文假定使用PROPAGATIO…