力扣每日一题(2023年2月)

news/2024/4/20 0:16:14/文章来源:https://blog.csdn.net/Seven597/article/details/129063546

2023年2月期每日一题

  • 第一天 (2325. 解密消息)
  • 第十六天(2341. 数组能形成多少数对)
  • 第十七天 (1139. 最大的以 1 为边界的正方形)
  • 第十八天 (1237. 找出给定方程的正整数解)
  • 第十九天 (1792. 最大平均通过率)
  • 第二十天(2347. 最好的扑克手牌)
  • 第二十一天 (1326. 灌溉花园的最少水龙头数目)
  • 第二十四天(2357. 使数组中所有元素都等于零)
  • 第二十五天 (1247. 交换字符使得字符串相同)
  • 第二十七天 (1144. 递减元素使数组呈锯齿状)
  • 第二十八天 (2363. 合并相似的物品)

第一天 (2325. 解密消息)

问题
在这里插入图片描述
代码

class Solution {public String decodeMessage(String key, String message) {/** 根据key串出现的字符顺序 对应 字母表 生成对应的哈希表将明文根据哈希表解密*/char cur = 'a';Map<Character, Character> rules = new HashMap<Character, Character>();  // 用于保存根据key生成的对应关系for(int i=0; i<key.length(); i++) {// 生成哈希表char c = key.charAt(i);  // 拿到对应的字符if(c!=' ' && !rules.containsKey(c)) {// 当前字符未对应字母表的字符时rules.put(c, cur);cur++;  // 字母表指针后移}}// 根据生成的哈希表解密messageStringBuilder jm = new StringBuilder();for(int i=0; i<message.length(); i++) {char c = message.charAt(i);if(c!=' ') {// c不等于空格时,获取解密后的字符c = rules.get(c);}jm.append(c);}* return jm.toString();}
}

第十六天(2341. 数组能形成多少数对)

问题
在这里插入图片描述
代码

class Solution {public int[] numberOfPairs(int[] nums) {/** 可利用哈希表存储遍历到的每个数作为键位, 当某键位值为2时 */Map<Integer, Integer> cnt = new HashMap<Integer, Integer>();   // 用于记录每个数字出现的次数int count = 0;  // 用于记录出现成对的数字次数for(int num:nums) {cnt.put(num, cnt.getOrDefault(num,0) + 1);   // 当该键位已有时获取(没有时获取0) 再加1if(cnt.get(num) % 2 == 0) {// 成对出现一定为偶数count++;}}return new int[] {count, nums.length - count*2};}
}

第十七天 (1139. 最大的以 1 为边界的正方形)

问题
在这里插入图片描述
思想

/**
做题思想:
利用前缀和的方法来做,因为使用0/1来表示是否链接, 所以当(0,0)到(0,5)这个横线连通的话前缀和就是5了
利用两个二维度的数组, 分别用来计算 从左侧(i,0)到右侧(i,j)的前缀和,以及从上侧(0,j)到下侧(i,j)的前缀和
然后用一个二重循环分别测试以(i,j)点为左上点坐标时,
*/

代码

class Solution {public int largest1BorderedSquare(int[][] grid) {/** 做题思想: 利用前缀和的方法来做,因为使用0/1来表示是否链接, 所以当(0,0)到(0,5)这个横线连通的话前缀和就是5了利用两个二维度的数组, 分别用来计算  从左侧(i,0)到右侧(i,j)的前缀和,以及从上侧(0,j)到下侧(i,j)的前缀和然后用一个二重循环分别测试以(i,j)点为左上点坐标时,*/int m=grid.length, n = grid[0].length;  // m表示行,n表示列int maxEdge = Math.max(m,n);   // 最大的长度边为mxn的较小一个int [][] rowSum = new int [m][n+1];  // 横向统计前缀和int [][] colSum = new int [m+1][n];  // 竖向统计前缀和for(int i=0; i<m; i++) {for(int j=0; j<n; j++) {rowSum[i][j+1] = rowSum[i][j]+grid[i][j];  // 横向计算前缀和colSum[i+1][j] = colSum[i][j]+grid[i][j];  // 竖向计算前缀和}}int ans = 0; // 用于记录最大的正方形边界// 遍历判断,以(i,j)为左上角点 找最大的正方形for(int i=0; i<m; i++) {for(int j=0; j<n; j++) {for(int edge=ans+1; edge<=maxEdge; edge++) {// ans为记录当前探测到的最大的正方形长度边, 又因为又用1表示连接// 所以edge从ans+1开始表示用(i+edge-1,j)减去(i,j)位置前缀,可得出这两点间的实际距离,如果不等于edge,说明中间不连接if(i+edge-1>=m || j+edge-1>=n) {// 说明越界了break;}int left = colSum[i+edge][j]-colSum[i][j];  // 左侧边长度int top = rowSum[i][j+edge] - rowSum[i][j];  // 上侧边长度if(left!=edge || top!=left) {// 假如 左侧或者上侧 长度不等于edge, 说明不连续break;}int right = colSum[i+edge][j+edge-1] - colSum[i][j+edge-1]; // 右侧边长度int bottom = rowSum[i+edge-1][j+edge] - rowSum[i+edge-1][j]; // 底侧边长度if(right==edge && bottom==edge) {// 底侧与右侧边也要等于edge时,说明又找到更大的正方形了ans=edge;}}}}return ans*ans;   // ans为边,以ans为边的正方形包括元素为ans的平方个}
}

第十八天 (1237. 找出给定方程的正整数解)

问题
在这里插入图片描述
代码

class Solution {public List<List<Integer>> findSolution(CustomFunction customfunction, int z) {/** 通过二分查找, 调用给定函数,添加符合题意得数对 */List<List<Integer>> res = new ArrayList<List<Integer>>();for(int x=1; x<1000; x++) {int yleft = 1, yright = 1000;while(yleft <= yright) {int ymid = (yleft + yright) / 2;if(customfunction.f(x,ymid) == z) {// 找到符合规定得数List<Integer> pair = new ArrayList<Integer>();pair.add(x);pair.add(ymid);res.add(pair);}if(customfunction.f(x,ymid)>z) {// 说明ymid大了,调整高位yright = ymid-1;}else {// 说明ymid低了,调整低位yleft = ymid + 1;}    }}return res;}}

第十九天 (1792. 最大平均通过率)

问题
在这里插入图片描述
思想·
在这里插入图片描述
代码

class Solution {public double maxAverageRatio(int[][] classes, int extraStudents) {PriorityQueue<int[]> pq = new PriorityQueue<int[]>((a,b)->{  //PriorityQueue每次会取出优先级最小的long val1 = (long)(b[1]+1)*b[1]*(a[1]-a[0]);long val2 = (long)(a[1]+1)*a[1]*(b[1]-b[0]);if(val1 == val2) {return 0;}return val1<val2?1:-1;});for(int[] c:classes) {pq.offer(new int[] {c[0], c[1]});}for(int i=0; i<extraStudents; i++) {// 将给定必过的学生分配给权值最小的班级int[] arr = pq.poll();int pass = arr[0], total = arr[1];pq.offer(new int[] {pass+1, total+1});}double res = 0;// 计算最大平均通过率for(int i=0; i<classes.length; i++) {int[] arr = pq.poll();int pass = arr[0], total = arr[1];res += 1.0 * pass / total;}return res/classes.length;}
}

第二十天(2347. 最好的扑克手牌)

问题
在这里插入图片描述
代码

class Solution {public String bestHand(int[] ranks, char[] suits) {/**根据 题目规则编写函数即可*/Set<Character> suitsSet = new HashSet<Character>();for(char suit : suits) {// 遍历一遍花色,加入到集合中suitsSet.add(suit);}// 因为集合相同得元素只能保存一次if(suitsSet.size() == 1) {return "Flush";  // 当花色相同时,size为1}// 用于保存出现数字的个数Map<Integer,Integer> ranksMap = new HashMap<>();for(int rank : ranks) {ranksMap.put(rank, ranksMap.getOrDefault(rank, 0) + 1);}// 假如有五个数字都不一样if(ranksMap.size()==5) {return "High Card";}// 判断是否有三张花色以上相同的for(Map.Entry<Integer,Integer> entry : ranksMap.entrySet()) {if(entry.getValue()>2) {return "Three of a Kind";}}// 不满足上面的情况,只能是两张数字一样了return "Pair";}
}

第二十一天 (1326. 灌溉花园的最少水龙头数目)

问题
在这里插入图片描述
思想

/**
思想:
可将本题看成将没个i处可覆盖的区域为一个小区间, 求最小覆盖的区间数
*/

代码

class Solution {public int minTaps(int n, int[] ranges) {/**思想:可将本题看成将没个i处可覆盖的区域为一个小区间, 求最小覆盖的区间数*/int [][] intervals = new int[n+1][];   // 创建保存每个i可覆盖的区间for(int i=0; i<=n; i++) {// 将这些小区间保存为一些数组// 确保这些区间不会超过(0-n)这个数值范围int start= Math.max(0, i-ranges[i]);  // 区间开头int end = Math.min(n,i+ranges[i]);    // 区间结尾intervals[i] = new int[] {start, end};}// 将每个小区间的开始端按升序排序Arrays.sort(intervals, (a,b) -> a[0]-b[0]);int[] dp = new int[n+1];  // 创建动态规划dp,记录到第i个区间覆盖[0-i]的最小区间数Arrays.fill(dp, Integer.MAX_VALUE);dp[0] = 0;for(int [] interval : intervals) {int start = interval[0], end = interval[1];if(dp[start] == Integer.MAX_VALUE) {return -1;   // 当dp[start] 等于 int上限时,说明当前区间覆盖不完整个区域}for(int j=start; j<=end; j++) {dp[j] = Math.min(dp[j], dp[start]+1);}}return dp[n];}
}

第二十四天(2357. 使数组中所有元素都等于零)

问题
在这里插入图片描述
代码

class Solution {public int minimumOperations(int[] nums) {/** 思想:读懂题目后,会发现,每次都会减去最小的操作数因此操作数不同的个数,就是要减去最少的非零元素(注意不要统计0)*/int ans = 0;// 用于保存值HashSet<Integer> hashSet = new HashSet<>();for(int num : nums) {if(!hashSet.contains(num) && num != 0) {// 只有当前遍历到的值不在set中,并且不为零,才统计ans++;}hashSet.add(num);}return ans;}
}

第二十五天 (1247. 交换字符使得字符串相同)

问题
在这里插入图片描述

思想

/**
思想:
出现交换的情况无非 s1为x,s2为y (称之为xy)或者s1为y,s2为x(称之为yx)
我们记录这些不对称的情况, 可以通过交换去消除
消除时如图所示,可通过一次交换,消除 两次xy情况 “或者” 消除两次yx情况
也可以通过两次交换消除 一次xy情况与一次yx情况
因此。xy情况加yx情况一定是偶数次才有可能通过交换换成两个相同字符串
*/

在这里插入图片描述
代码

class Solution {public int minimumSwap(String s1, String s2) {/**思想:出现交换的情况无非   s1为x,s2为y (称之为xy)或者s1为y,s2为x(称之为yx)我们记录这些不对称的情况, 可以通过交换去消除消除时如图所示,可通过一次交换,消除 两次xy情况  “或者” 消除两次yx情况也可以通过两次交换消除   一次xy情况与一次yx情况因此。xy情况加yx情况一定是偶数次才有可能通过交换换成两个相同字符串*/int xy=0,yx=0;   // 记录对应位置情况的个数int n = s1.length();  // 字符串长度相等for(int i=0; i<n; i++) {char a = s1.charAt(i), b = s2.charAt(i);   // 获取两个字符串相同位置i的字符if(a=='x' && b=='y') {  // xy情况xy++;}if(a=='y' && b=='x') {  // yx情况yx++;}}if((xy+yx)%2==1) {  // 交换次数为奇数时,换不成一样的串return -1;}/** xy/2或者yx/ 2  是一次交换消除两次不对称的情况; xy%2或者yx%2 一定是最后两次交换消两种情况各一次的时候  */return xy/2 + yx/2 + xy%2 + yx%2;    }
}

第二十七天 (1144. 递减元素使数组呈锯齿状)

问题
在这里插入图片描述

思想

/**
思想:
变成锯齿状, 无非就是将偶数下标处或者奇数下标处变成小于两侧的值
注意,小于两侧时,只需要小于两侧较小的数即可。
换句话的意思就是 当前值分别减两侧值,得到最大的数+1即可,
当当前值已经小于两侧时, 减去两侧值时就是负数,初始记录res=0,则取大值就是0
*/

代码

class Solution {public int movesToMakeZigzag(int[] nums) {/** 思想:变成锯齿状, 无非就是将偶数下标处或者奇数下标处变成小于两侧的值注意,小于两侧时,只需要小于两侧较小的数即可。换句话的意思就是  当前值分别减两侧值,得到最大的数+1即可, 当当前值已经小于两侧时, 减去两侧值时就是负数,初始记录res=0,则取大值就是0*/int res0 = 0, res1 = 0;for(int i=0; i<nums.length; i++) {int a = 0;  // 临时计算减去数if(i>0) {  // i>0就是满足与左侧比较的条件a = Math.max(a, nums[i] - nums[i-1] + 1);}if(i<nums.length-1) {  // 满足与右侧比较的条件a = Math.max(a, nums[i] - nums[i+1] + 1);}if(i%2==0) { // 偶数为低位res0+=a;}else { // 偶数为低位res1+=a;}}return res0>res1?res1:res0;  // 返回小的}
}

第二十八天 (2363. 合并相似的物品)

问题
在这里插入图片描述

思想

/**
思想: 遍历两个价值重量列表,将相同价值的作为键重量和为值保存到map中
再遍历map,以键为数组第一个元素,值为数组第二个元素
*/

代码

class Solution {public List<List<Integer>> mergeSimilarItems(int[][] items1, int[][] items2) {/** 思想: 遍历两个价值重量列表,将相同价值的作为键重量和为值保存到map中再遍历map,以键为数组第一个元素,值为数组第二个元素*/// 创建一个MapMap<Integer, Integer> hashMap = new HashMap<>();  // 用于记录价值-重量和for(int i=0; i<items1.length; i++) {  // 统计第一个二维数组的重量和hashMap.put(items1[i][0], hashMap.getOrDefault(items1[i][0], 0) + items1[i][1]);}for(int i=0; i<items2.length; i++) {   // 统计第二个二维数组的重量和hashMap.put(items2[i][0], hashMap.getOrDefault(items2[i][0], 0) + items2[i][1]);}// 创建保存返回值的二维列表List<List<Integer>> ret = new ArrayList<List<Integer>>();//遍历map,将[键,值]加入二维列表for(Map.Entry<Integer, Integer> entry : hashMap.entrySet()) {List<Integer> listT = new ArrayList<>();// 将键值加入小集合listT.add(entry.getKey());listT.add(entry.getValue());// 将小集合加入大集合ret.add(listT);} // 排序!Collections.sort(ret, (a,b)->a.get(0)-b.get(0));return ret;}

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【再临数据结构】Day1. 稀疏数组

前言 这不单单是稀疏数组的开始&#xff0c;也是我重学数据结构的开始。因此&#xff0c;在开始说稀疏数组的具体内容之前&#xff0c;我想先说一下作为一个有着十余年“学龄”的学生&#xff0c;所一直沿用的一个学习方法&#xff1a;3W法。我认为&#xff0c;只有掌握了正确的…

Apache Hive入门

文章目录一、Apache Hive概述1.1、什么是Hive1.2、使用Hive原因1.3、Hive和Hadoop关系二、Hive功能思想2.1、映射信息记录2.2、SQL语法解析、编译三、Hive架构、组件3.1、Hive架构图3.2Hive组件四、Hive常用操作4.1、数据类型4.1.1、基本数据类型4.1.2、集合数据类型4.2、数据库…

本地新项目上传到git的详细步骤

前提&#xff1a;你本地的项目目录里要记得添加.gitignore忽略文件&#xff0c;免得把一些无用的文件提交&#xff0c;内容如下&#xff0c;可直接粘贴&#xff1a; # Created by .ignore support plugin (hsz.mobi) ### Java template # Compiled class file *.class# Log fi…

2023-02-28 mmap的原理及使用-思考

摘要: 最近在使用mmap解决数据库内存占用损耗过高导致OOM的问题, 不得不说在有些场景下mmap是非常有用. 本文主要涉及一些对mmap的思考. mmap本身的思考: mmap和文件系统的交互规则是什么mmap中给进程虚拟内存映射的文件上的部分,是什么? 为什么是页缓存? 有没有文件缓存?…

华为OD机试题,用 Java 解【连续字母长度】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

百度CTO王海峰:深度学习平台+大模型,夯实产业智能化基座

2月27日&#xff0c;中国人工智能学会首届智能融合产业论坛在成都顺利举办。本届论坛由中国人工智能学会&#xff08;CAAI&#xff09;主办&#xff0c;中国人工智能学会智能融合专委会、百度公司、深度学习技术及应用国家工程研究中心和电子科技大学联合承办。中国工程院多名院…

企业级React Hooks实战开发指南

背景 大家有没有发现一个问题&#xff0c;我们从任何招聘网站上看到关于React(现在90%都是React Hooks)开发的招聘岗位薪资一定都比其他前端岗位的高&#xff0c;那是什么原因呢&#xff1f;本质的原因是&#xff1a;React学习成本高&#xff0c;导致学习的人少&#xff0c;然…

跟对象介绍十个常用的 Python 内置函数,她夸了我一整天

内置函数是什么 了解内置函数之前&#xff0c;先来了解一下什么是函数 将使用频繁的代码段进行封装&#xff0c;并给它起一个名字&#xff0c;当我们使用的时候只需要知道名字就行 函数就是一段封装好的、可以重复使用的代码&#xff0c;函数使得我们的程序更加简洁、模块化&a…

Goframe快速创建项目,并使用Cli工具创建dao、service、logic

GoFrame项目创建与Cli工具创建1.项目创建2.Mysql数据库配置3.Cli工具dao自动生成4.业务模型须知5.Cli工具service/logic自动生成 - 接口6.Controller/Api创建1.项目创建 官网 - 项目创建-init 开发文档 - 目录介绍 官网 - 示例项目 1.gf init 项目名 &#xff08;创建项目…

Java及JVM简介

世界上没有最好的编程语言&#xff0c;只有最适用于具体应用场景的编程语言 懂得JVM内部的内存结构、工作机制&#xff0c;是设计高扩展性应用和诊断运行时问题的基础&#xff0c;也是Java工程师进阶的必备能力。 java介绍 java是目前应用最为广泛的软件开发平台之一。随着…

C++---最长上升子序列模型---登山(每日一道算法2023.2.28)

注意事项&#xff1a; 本题为"线性dp—最长上升子序列的长度" 和 “最长上升子序列模型—怪盗基德的滑翔翼” 的扩展题&#xff0c;所以dp思路这里就不再赘述。 题目&#xff1a; 五一到了&#xff0c;ACM队组织大家去登山观光&#xff0c;队员们发现山上一共有N个景…

复习知识点八之数组

目录 数组 静态初始化练习 打印 索引 数组遍历 练习1:遍历数组并求和 练习2:统计个数 练习3:变化数据​编辑 数组的动态初始化 数组的动态初始化和静态初始化的区别​编辑 数组的常见问题 数组常见操作 练习1:求最值 ​编辑 练习2 : 遍历数组求和 练习3: 练习4: 数…

值得收藏!适合小微企业的万元数字化攻略!

编者按&#xff1a;小微企业数字化之路困难重重&#xff1f;看看这款全新的全面数字化方案&#xff0c;低成本、部署效率、免安装、免维护、数据安全&#xff0c;小微企业的数字化福音&#xff01;关键词&#xff1a;低成本&#xff0c;开箱即用&#xff0c;免安装免维护&#…

SpringMVC使用 redis 实现缓存

简介 SpringMVC 中也可以将缓存标签和 redis 结合起来使用&#xff0c;其实此时缓存没有起作用&#xff0c;只是通过缓存的那几个注解来操作 redis 而已&#xff1b;SpringMVC 中整合 redis 比较麻烦的是注意版本冲突的问题&#xff0c;如下是官网有关于版本的要求 https://d…

I.MX6ULL内核开发12:使用设备树插件实现RGB灯驱动

目录 一、引言 二、设备树插件格式 三、实验说明 四、实验准备 4.1 通过内核工具编译设备树插件 五、实验效果 5.1 uboot加载 5.2 加载RGB驱动 一、引言 Linux4.4以后引入了动态设备树&#xff08;Dynamic DevicesTree&#xff09;&#xff0c;这里翻译位“设备树插件…

银行软件测试面试题目总结,希望可以帮到你

目录 一、根据题目要求写出具体LINUX操作命令 二、JMETER题目 三、根据题目要求写出具体SQL语句 总结感谢每一个认真阅读我文章的人&#xff01;&#xff01;&#xff01; 重点&#xff1a;配套学习资料和视频教学 一、根据题目要求写出具体LINUX操作命令 1、分别写出一种…

SpringMVC源码:HandlerMapping加载1

参考资料&#xff1a; 《SpringMVC源码解析系列》 《SpringMVC源码分析》 《Spring MVC源码》 写在开头&#xff1a;本文为个人学习笔记&#xff0c;内容比较随意&#xff0c;夹杂个人理解&#xff0c;如有错误&#xff0c;欢迎指正。 前文&#xff1a; 《SpringMVC源码&a…

跨设备文件传输工具横评

文章目录对比QQ微信SnapDropLocalSendIntelUnisonLANDropTailscaleAirDroidSendAnywhere参考文献对比 传输速度测试条件大致相同&#xff0c;文件大小约为 100 MB 工具优点缺点传输速度备注QQ支持断点续传不要求同一局域网需要安装1.81 MB/s微信方便需要安装不支持大文件传完还…

ROS1学习笔记:ROS中的坐标管理系统(ubuntu20.04)

参考B站古月居ROS入门21讲&#xff1a;ROS中的坐标系管理系统 基于VMware Ubuntu 20.04 Noetic版本的环境 文章目录一、机器人中的坐标变换二、TF功能包三、小海龟跟随实验3.1 启动实验3.2 查看当前的TF树3.3 坐标相对位置可视化3.3.1 tf_echo3.3.2 rviz一、机器人中的坐标变换…

15个Spring扩展点,一般人知道的不超过5个!

Spring的核心思想就是容器&#xff0c;当容器refresh的时候&#xff0c;外部看上去风平浪静&#xff0c;其实内部则是一片惊涛骇浪&#xff0c;汪洋一片。Spring Boot更是封装了Spring&#xff0c;遵循约定大于配置&#xff0c;加上自动装配的机制。很多时候我们只要引用了一个…