代码随想录-Day53

739. 每日温度

给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。

示例 1:

输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
示例 2:

输入: temperatures = [30,40,50,60]
输出: [1,1,1,0]
示例 3:

输入: temperatures = [30,60,90]
输出: [1,1,0]
在这里插入图片描述
在这里插入图片描述

方法一:

class Solution {// 版本 1public int[] dailyTemperatures(int[] temperatures) {int lens=temperatures.length;int []res=new int[lens];/**如果当前遍历的元素 大于栈顶元素,表示 栈顶元素的 右边的最大的元素就是 当前遍历的元素,所以弹出 栈顶元素,并记录如果栈不空的话,还要考虑新的栈顶与当前元素的大小关系否则的话,可以直接入栈。注意,单调栈里 加入的元素是 下标。*/Deque<Integer> stack=new LinkedList<>();stack.push(0);for(int i=1;i<lens;i++){if(temperatures[i]<=temperatures[stack.peek()]){stack.push(i);}else{while(!stack.isEmpty()&&temperatures[i]>temperatures[stack.peek()]){res[stack.peek()]=i-stack.peek();stack.pop();}stack.push(i);}}return  res;}

这段代码是用于解决「每日温度」问题的Java实现,这个问题的目标是给定一个整数数组 temperatures,其中每个元素表示每天的温度,返回一个新的数组,其中每个元素表示直到未来几天才会出现更高的温度的天数。如果不存在未来几天会出现更高的温度,那么该位置的值为0。

代码解析

  1. 初始化:

    • 创建一个与 temperatures 长度相同的数组 res,用于存放结果。
    • 使用一个单调栈 stack,数据结构为 Deque,在Java中通常使用 LinkedList 实现,用于存储下标。
  2. 遍历并维护单调栈:

    • 遍历 temperatures 数组中的每个元素。
    • 对于当前遍历到的元素 temperatures[i]
      • 如果该元素小于等于栈顶元素对应的温度,即 temperatures[i] <= temperatures[stack.peek()],则将当前下标 i 入栈。
      • 否则,进入一个while循环:
        • 当栈不为空且当前元素大于栈顶元素对应的温度时,弹出栈顶元素,并计算栈顶元素下标到当前下标 i 的距离,即 i - stack.peek(),并将这个距离存入结果数组 res 的对应位置。
        • 继续循环,直到栈为空或当前元素不大于栈顶元素对应的温度。
      • 最后,将当前下标 i 入栈。
  3. 返回结果:

    • 返回结果数组 res,其中每个元素表示直到未来几天才会出现更高的温度的天数。

时间复杂度和空间复杂度

  • 时间复杂度: O(n),其中 n 是数组 temperatures 的长度。每个元素至多被放入和弹出栈一次。
  • 空间复杂度: O(n),需要一个大小为 n 的结果数组 res 和一个单调栈 stack

总结

这段代码通过使用单调栈的策略,有效地解决了每日温度问题,能够快速找到每个温度元素右边第一个比它大的温度元素的位置。单调栈是一种常用的数据结构,在处理与单调性相关的数组或序列问题时非常有用,例如寻找最近的更大或更小的元素、股票价格波动分析等。在实际应用中,掌握单调栈的原理和使用方法能够帮助解决一系列经典问题,提高代码效率。

方法二:

    //--------这 是一条分界线// 版本 2class Solution {public int[] dailyTemperatures(int[] temperatures) {int lens=temperatures.length;int []res=new int[lens];Deque<Integer> stack=new LinkedList<>();for(int i=0;i<lens;i++){while(!stack.isEmpty()&&temperatures[i]>temperatures[stack.peek()]){res[stack.peek()]=i-stack.peek();stack.pop();}stack.push(i);}return  res;}

这段代码同样是用于解决「每日温度」问题的Java实现,其目标与前一版本相同,即给定一个整数数组 temperatures,返回一个新的数组,其中每个元素表示直到未来几天才会出现更高的温度的天数。如果不存在未来几天会出现更高的温度,那么该位置的值为0。

代码解析

  1. 初始化:

    • 创建一个与 temperatures 长度相同的数组 res,用于存放结果。
    • 使用一个单调栈 stack,数据结构为 Deque,在Java中通常使用 LinkedList 实现,用于存储下标。
  2. 遍历并维护单调栈:

    • 遍历 temperatures 数组中的每个元素。
    • 对于当前遍历到的元素 temperatures[i]
      • 进入一个while循环,只要栈不为空且当前元素大于栈顶元素对应的温度,执行以下操作:
        • 计算栈顶元素下标到当前下标 i 的距离,即 i - stack.peek(),并将这个距离存入结果数组 res 的对应位置。
        • 弹出栈顶元素。
      • 将当前下标 i 入栈。
  3. 返回结果:

    • 返回结果数组 res,其中每个元素表示直到未来几天才会出现更高的温度的天数。

时间复杂度和空间复杂度

  • 时间复杂度: O(n),其中 n 是数组 temperatures 的长度。每个元素至多被放入和弹出栈一次。
  • 空间复杂度: O(n),需要一个大小为 n 的结果数组 res 和一个单调栈 stack

版本对比

相比于版本1,版本2的代码在遍历过程中直接从头开始,简化了代码逻辑,将入栈操作放在了while循环的外部。这种写法同样有效,且逻辑上更清晰,因为它避免了不必要的条件判断(如版本1中的 temperatures[i] <= temperatures[stack.peek()])。每次遍历到新元素时,代码首先处理栈中所有比当前元素小的元素,然后将当前元素入栈,这一过程确保了栈内的元素始终按温度递减的顺序排列,即形成了一个单调递减栈。

总结

通过使用单调栈的策略,版本2的代码同样有效地解决了每日温度问题。这种实现方式不仅保持了良好的时间复杂度和空间复杂度,而且在代码结构上更为精简和直观,有助于提高代码的可读性和维护性。单调栈在处理与单调性相关的数组或序列问题时是一种非常有用的工具,熟练掌握其使用方法对于解决一系列经典问题具有重要意义。

496. 下一个更大元素 I

nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。

给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。

对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1 。

返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素 。

示例 1:

输入:nums1 = [4,1,2], nums2 = [1,3,4,2].
输出:[-1,3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:

  • 4 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
  • 1 ,用加粗斜体标识,nums2 = [1,3,4,2]。下一个更大元素是 3 。
  • 2 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
    示例 2:

输入:nums1 = [2,4], nums2 = [1,2,3,4].
输出:[3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:

  • 2 ,用加粗斜体标识,nums2 = [1,2,3,4]。下一个更大元素是 3 。
  • 4 ,用加粗斜体标识,nums2 = [1,2,3,4]。不存在下一个更大元素,所以答案是 -1 。

方法一:

class Solution {public int[] nextGreaterElement(int[] nums1, int[] nums2) {Stack<Integer> temp = new Stack<>();int[] res = new int[nums1.length];Arrays.fill(res,-1);HashMap<Integer, Integer> hashMap = new HashMap<>();for (int i = 0 ; i< nums1.length ; i++){hashMap.put(nums1[i],i);}temp.add(0);for (int i = 1; i < nums2.length; i++) {if (nums2[i] <= nums2[temp.peek()]) {temp.add(i);} else {while (!temp.isEmpty() && nums2[temp.peek()] < nums2[i]) {if (hashMap.containsKey(nums2[temp.peek()])){Integer index = hashMap.get(nums2[temp.peek()]);res[index] = nums2[i];}temp.pop();}temp.add(i);}}return res;}
}

这段代码是用于解决「下一个更大元素 I」问题的Java实现。给定两个没有重复元素的数组 nums1nums2,其中 nums1nums2 的一个子集,目标是对于 nums1 中的每一个元素,找到在 nums2 中下一个更大的元素的值。如果没有这样的元素,那么输出 -1。

代码解析

  1. 初始化:

    • 创建一个单调栈 temp,数据结构为 Stack,用于存储 nums2 中元素的下标。
    • 创建一个结果数组 res,初始化所有元素为 -1,长度与 nums1 相同。
    • 创建一个哈希映射 hashMap,用于存储 nums1 中元素及其在 res 数组中的下标,以便快速查找和更新结果。
  2. 遍历并维护单调栈:

    • 遍历 nums2 数组中的每个元素。
    • 对于当前遍历到的元素 nums2[i]
      • 如果该元素小于等于栈顶元素对应的值,即 nums2[i] <= nums2[temp.peek()],则将当前下标 i 入栈。
      • 否则,进入一个while循环:
        • 当栈不为空且当前元素大于栈顶元素对应的值时,检查栈顶元素是否在 nums1 中,如果是,则获取该元素在 res 中的下标,并将当前元素的值赋给 res 的对应位置。
        • 继续循环,直到栈为空或当前元素不大于栈顶元素对应的值。
      • 最后,将当前下标 i 入栈。
  3. 返回结果:

    • 返回结果数组 res,其中每个元素表示 nums1 中对应元素在 nums2 中的下一个更大元素的值,若不存在则为 -1

时间复杂度和空间复杂度

  • 时间复杂度: O(m + n),其中 m 和 n 分别是数组 nums1nums2 的长度。每个元素至多被放入和弹出栈一次,哈希表的查找操作平均时间复杂度为 O(1)。
  • 空间复杂度: O(n),需要一个大小为 n 的单调栈 temp 和一个哈希映射 hashMap,以及一个结果数组 res

总结

这段代码通过使用单调栈和哈希映射的策略,有效地解决了下一个更大元素问题,能够快速找到 nums1 中每个元素在 nums2 中下一个更大元素的值。单调栈是一种常用的数据结构,在处理与单调性相关的数组或序列问题时非常有用,结合哈希映射能够进一步提高查找效率。在实际应用中,掌握这些数据结构和算法原理能够帮助解决一系列经典问题,提高代码效率和性能。

方法二:

// 版本2
class Solution {public int[] nextGreaterElement(int[] nums1, int[] nums2) {HashMap<Integer, Integer> map = new HashMap<>();for (int i = 0; i < nums1.length; i++) {map.put(nums1[i], i);}int[] res = new int[nums1.length];Stack<Integer> stack = new Stack<>();Arrays.fill(res, -1);for (int i = 0; i < nums2.length; i++) {while (!stack.isEmpty() && nums2[stack.peek()] < nums2[i]) {int pre = nums2[stack.pop()];if (map.containsKey(pre)) {res[map.get(pre)] = nums2[i];}}stack.push(i);}return res;}
}

这段代码是用于解决「下一个更大元素 I」问题的另一种Java实现,其实现思路与之前解析的版本相似,但代码结构和变量命名有所不同,旨在解决给定两个没有重复元素的数组 nums1nums2,其中 nums1nums2 的一个子集,对于 nums1 中的每一个元素,找到在 nums2 中下一个更大的元素的值。如果没有这样的元素,那么输出 -1。

代码解析

  1. 初始化:

    • 创建一个哈希映射 map,用于存储 nums1 中元素及其在 nums1 中的下标,以便快速查找和更新结果。
    • 创建一个结果数组 res,初始化所有元素为 -1,长度与 nums1 相同。
    • 创建一个单调栈 stack,数据结构为 Stack,用于存储 nums2 中元素的下标。
  2. 构建哈希映射:

    • 遍历 nums1 数组,将每个元素及其在 nums1 中的下标存储在 map 中。
  3. 遍历并维护单调栈:

    • 遍历 nums2 数组中的每个元素。
    • 对于当前遍历到的元素 nums2[i]
      • 如果栈不为空并且栈顶元素对应的值小于当前元素,即 nums2[stack.peek()] < nums2[i],则:
        • 弹出栈顶元素,并获取其值。
        • 如果弹出的元素在 nums1 中,即 map 中存在该元素,那么在 res 数组的对应位置填入当前元素的值。
      • 继续这个过程,直到栈为空或者栈顶元素对应的值不再小于当前元素。
      • 最后,将当前下标 i 入栈。
  4. 返回结果:

    • 返回结果数组 res,其中每个元素表示 nums1 中对应元素在 nums2 中的下一个更大元素的值,若不存在则为 -1

时间复杂度和空间复杂度

  • 时间复杂度: O(m + n),其中 m 和 n 分别是数组 nums1nums2 的长度。每个元素至多被放入和弹出栈一次,哈希表的查找操作平均时间复杂度为 O(1)。
  • 空间复杂度: O(n),需要一个大小为 n 的单调栈 stack 和一个哈希映射 map,以及一个结果数组 res

总结

这段代码同样通过使用单调栈和哈希映射的策略,有效地解决了下一个更大元素问题,能够快速找到 nums1 中每个元素在 nums2 中下一个更大元素的值。代码结构清晰,逻辑直观,是解决这类问题的一种典型且高效的方法。掌握这些数据结构和算法原理能够帮助解决一系列经典问题,提高代码效率和性能。在实际应用中,根据具体需求和场景选择合适的数据结构和算法是非常重要的。

503. 下一个更大元素 II

给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。

数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1 。

示例 1:

输入: nums = [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数;
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。
示例 2:

输入: nums = [1,2,3,4,3]
输出: [2,3,4,-1,4]

class Solution {public int[] nextGreaterElements(int[] nums) {//边界判断if(nums == null || nums.length <= 1) {return new int[]{-1};}int size = nums.length;int[] result = new int[size];//存放结果Arrays.fill(result,-1);//默认全部初始化为-1Stack<Integer> st= new Stack<>();//栈中存放的是nums中的元素下标for(int i = 0; i < 2*size; i++) {while(!st.empty() && nums[i % size] > nums[st.peek()]) {result[st.peek()] = nums[i % size];//更新resultst.pop();//弹出栈顶}st.push(i % size);}return result;}
}

这段代码是用于解决「下一个更大元素 II」问题的Java实现。给定一个循环数组 nums(数组中元素的下一个元素是数组的第一个元素),目标是返回一个数组,其中每个元素是原数组中下一个更大元素的值,如果没有更大的元素,则对应位置的值为 -1。

代码解析

  1. 初始化:

    • 创建一个单调栈 st,数据结构为 Stack,用于存储 nums 中元素的下标。
    • 创建一个结果数组 result,初始化所有元素为 -1,长度与 nums 相同。
  2. 遍历并维护单调栈:

    • 遍历 nums 数组两次,即遍历 2 * nums 的长度(考虑到循环数组的性质),使用模运算 i % size 来获取实际数组下标。
    • 对于当前遍历到的元素 nums[i % size]
      • 如果栈不为空并且栈顶元素对应的值小于当前元素,即 nums[st.peek()] < nums[i % size],则:
        • 更新 result 数组中对应位置的值为当前元素的值。
        • 弹出栈顶元素。
      • 继续这个过程,直到栈为空或者栈顶元素对应的值不再小于当前元素。
      • 最后,将当前下标 i % size 入栈。
  3. 返回结果:

    • 返回结果数组 result,其中每个元素表示原数组 nums 中对应元素的下一个更大元素的值,若不存在则为 -1

时间复杂度和空间复杂度

  • 时间复杂度: O(n),其中 n 是数组 nums 的长度。虽然代码中遍历了 2 * nums 的长度,但是每个元素至多被放入和弹出栈一次,因此总的时间复杂度为 O(n)。
  • 空间复杂度: O(n),需要一个大小为 n 的单调栈 st 和一个结果数组 result

总结

这段代码通过使用单调栈的策略,有效地解决了下一个更大元素 II 问题,能够处理循环数组并找到每个元素的下一个更大元素的值。代码逻辑清晰,通过两次遍历数组并使用模运算处理循环数组的特点,实现了高效的解题策略。单调栈在处理这类问题时表现出了强大的能力,能够快速找到特定条件下下一个更大的元素,是解决此类问题的经典方法。在实际应用中,了解和掌握单调栈的使用方法对于解决与单调性相关的数组或序列问题具有重要意义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1475560.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

微信视频号及直播回放下载工具

最近需要下载微信视频号中的视频&#xff0c;找一圈&#xff0c;终于找到了&#xff0c;&#xff0c;免费&#xff0c;没广告 软件叫做&#xff1a;爱享素材下载器。 是一款开源的、完全免费的工具。 第1步&#xff1a;下载安装包 下载地址&#xff1a; https://github.com/p…

年销量超1亿箱,三得利BOSS咖啡如何凭借人群战略打造极致产品力?

BOSS咖啡诞生于1992年&#xff0c;在可口可乐、朝日、麒麟等饮料巨头先后入局&#xff0c;市场竞争非常激烈的情况下&#xff0c;BOSS咖啡成为受国民欢迎的品牌&#xff0c;它是如何做到的呢? 罐装咖啡趋势崛起&#xff0c;各大品牌推出罐装咖啡 自1980年代起&#xff0c;罐装…

猫咪浮毛多怎么办?一分钟推荐性价比高的养猫空气净化器排名

作为一名猫咖店老板&#xff0c;我发现很多铲屎官来店里咨询&#xff0c;在春夏换季时会频繁打喷嚏、全身过敏红肿。这是因为猫咪在换季时会大量掉毛&#xff0c;家里就像下雪一样&#xff0c;空气中充满了猫毛。这些猫毛上附带的细菌会随浮毛被人吸入&#xff0c;从而引发打喷…

顶会FAST24最佳论文|阿里云块存储架构演进的得与失-2.EBS是什么?

EBS&#xff0c;即Elastic Block Storage&#xff0c;是一种云存储服务&#xff0c;旨在提供高性能、高弹性和高可用性的虚拟块设备存储。该服务的核心设计思想是计算与存储的解耦合&#xff08;Compute-Storage Disaggregation&#xff09;&#xff0c;即计算资源&#xff08;…

Windows10/11家庭版开启Hyper-V虚拟机功能详解

Hyper-V是微软的一款虚拟机软件&#xff0c;可以使我们在一台Windows PC上&#xff0c;在虚拟环境下同时运行多个互相之间完全隔离的操作系统&#xff0c;这就实现了在Windows环境下运行Linux以及其他OS的可能性。和第三方虚拟机软件&#xff0c;如VMware等相比&#xff0c;Hyp…

MoonBit 周报 Vol.48:默认开启诊断信息渲染、test block 不再返回 Result 类型的结果

weekly 2024-07-08 MoonBit 更新 【重大更新】修改 array slice 的语法&#xff0c;从 arr[start..end] 修改为类似 Python 的 arr[start:end]。这是为了避免和接下来要支持的 cascade method call x..f() 产生语法冲突。旧的语法会在近期删除。 【Wasm后端重大更新】将 fn i…

【ROS2】初级:客户端-创建一个包

目标&#xff1a;使用 CMake 或 Python 创建一个新包&#xff0c;并运行其可执行文件。 教程级别&#xff1a;初学者 时间&#xff1a;15 分钟 目录 背景 1. ROS 2 包是什么&#xff1f;2. 组成 ROS 2 包的是什么&#xff1f;3. 工作区中的包 先决条件 任务 1. 创建一个包2. 打…

腾讯发布2024大模型十大最新趋势!

近日&#xff0c;在2024世界人工智能大会上&#xff0c;腾讯正式发布了《2024大模型十大趋势——走进“机器外脑”时代》报告。目前&#xff0c;这一报告正在AI产业界各大社群快速传播。 报告中&#xff0c;腾讯研究院试图通过10个关键性的趋势&#xff0c;去理解全世界范围内正…

一文清晰了解HTML——简单实例

想要仿照该页面编写HTML代码&#xff1a; 在vscode中输入&#xff01;自动生成默认模板&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevic…

为什么KV Cache只需缓存K矩阵和V矩阵,无需缓存Q矩阵?

大家都知道大模型是通过语言序列预测下一个词的概率。假定{ x 1 x_1 x1​&#xff0c; x 2 x_2 x2​&#xff0c; x 3 x_3 x3​&#xff0c;…&#xff0c; x n − 1 x_{n-1} xn−1​}为已知序列&#xff0c;其中 x 1 x_1 x1​&#xff0c; x 2 x_2 x2​&#xff0c; x 3 x_3 x…

第二证券股市资讯:深夜!突然暴涨75%!

一则重磅收买引发医药圈轰动。 北京时间7月8日晚间&#xff0c;美股开盘后&#xff0c;美国生物制药公司Morphic股价一度暴升超75%。音讯面上&#xff0c;生物医药巨子礼来公司官宣&#xff0c;将以57美元/股的价格现金收买Morphic&#xff0c;较上星期五的收盘价溢价79%&…

Dungeonborne卡顿延迟怎么办?这样降低Dungeonborne延迟

Dungeonborne将第一人称的动作的即时性和经典的西幻RPG职业设计深度结合&#xff0c;带来无与伦比的游戏体验。玩家在游戏中扮演一位从神秘地牢中醒来的勇士&#xff0c;他必须面对各种未知的敌人和挑战&#xff0c;逐渐揭开自己的身世之谜。在这个充满魔法和奇迹的世界里&…

微信如何快速回复信息呢?

时业务繁忙的时候可能会出现一大堆消息需要去回复&#xff0c;很多客户也会来问重复的问题&#xff0c;有时候回复消息也需要一个及时性&#xff0c;如果回复慢了有可能客户就跑了&#xff0c;那这个时候就会体现出自动回复的优势。 只要设置好一个关键词&#xff0c;只要对方…

朗新天霁eHR GetFunc_code.asmx SQL注入致RCE漏洞复现

0x01 产品简介 朗新天霁人力资源管理系统(LongShine eHR)是一款由北京朗新天霁软件技术有限公司研发的人力资源管理系统,该产品融合了国外先进的人力资源管理理念和国内大量人力资源管理实践经验,是国内功能较为全面、性价比较高的人力资源管理系统之一,系统凭借其集成化…

【C语言】auto 关键字详解

在C语言中&#xff0c;auto关键字用于声明局部变量&#xff0c;但它的使用已经变得很少见。事实上&#xff0c;从C99标准开始&#xff0c;auto关键字的默认行为就是隐含的&#xff0c;因此在大多数情况下无需显式使用它。 基本用法 在C语言中&#xff0c;auto关键字用于指定变…

Vulnhub靶场DC-6练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集1. wordpress扫描2. wordlists字典爆破 0x03 漏洞查找与利用1. 漏洞查找2. CVE-2018-15877漏洞利用3. 反弹shell5. nmap提权 0x04 总结 0x00 准备 下载链接&#xff1a;https://download.vulnhub.com/dc/DC-6.zip 介绍&#…

代码随想录打卡第十三天

代码随想录–二叉树部分 day13 二叉树第一天 文章目录 代码随想录--二叉树部分二叉树基础知识一、力扣144--二叉树的前序遍历&#xff08;递归&#xff09;二、力扣145--二叉树的后序遍历&#xff08;递归&#xff09;三、力扣94--二叉树的中序遍历&#xff08;递归&#xff0…

【密码学】哈希函数与加密算法的关系

一、哈希函数的定义 哈希函数&#xff08;Hash Function&#xff09;&#xff0c;也被称为散列函数或杂凑函数&#xff0c; 是一种将任意长度的输入数据&#xff08;通常称为“预映射”或“消息”&#xff09;转换为固定长度输出&#xff08;通常称为“哈希值”、“散列值”、“…

Kotlin linkedMapOf filterKeys

Kotlin linkedMapOf filterKeys fun main(args: Array<String>) {val lhm linkedMapOf<String, Any>(Pair("name", "phil"), //因为key相同都为 name&#xff0c;被后面的覆盖。Pair("year", 2024),Pair("name", "f…

Gradle基础:从入门到掌握

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 在现代软件开发中&#xff0c;自动化构建工具是提高效率和管理依赖的重要手段。而Gradle作为一种灵活且强大的构…