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

news2024/11/14 21:46:58

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++;  // 字母表指针后移
             }
         }

         // 根据生成的哈希表解密message
         StringBuilder 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) 再加1
            if(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,以键为数组第一个元素,值为数组第二个元素
         */


        // 创建一个Map
        Map<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.coloradmin.cn/o/376650.html

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

相关文章

再度盈利,搜狐稳了?

2016年在宣布要用3年时间回归互联网舞台中心之后&#xff0c;很长一段时间内张朝阳积极活跃在各种社交媒体上&#xff0c;完全是一派“积极出山”的姿态。而后畅游从美股退市&#xff0c;搜狗“卖身”腾讯&#xff0c;一系列的收缩动作又似乎是在逐渐远离喧嚣。而在最近三年&am…

Zilliz @ GAIDC |Milvus:生产级 AI 数据库探索

2月26日&#xff0c;全球人工智能开发者先锋大会— AI 数据与开源论坛在上海举行&#xff0c;Zilliz 主任工程师刘力在现场发表了名为《Milvus&#xff1a;生产级 AI 数据库探索》的演讲。刘力开篇便提到&#xff0c;Milvus 致力于打造更为完善的 AI 生态体系。随后&#xff0c…

阿赵的MaxScript学习笔记分享五《UI组件使用篇》

大家好&#xff0c;我是阿赵。这个专题的内容比较多&#xff0c;所以抓紧时间更新。这是第五篇&#xff0c;UI组件使用篇。 这里主要是把maxscript的rollout窗体支持的UI组件列举一下&#xff0c;并每个组件写一个使用范例&#xff0c;以方便理解和查看。 1、位图bitmap 可以指…

Java中常用的七种队列你了解多少?

文章目录Java中常用的七种队列你了解多少?ArrayBlockingQueue队列如何使用&#xff1f;添加元素到队列获取队列中的元素遍历队列LinkedBlockingQueue队列如何使用&#xff1f;1. 创建SynchronousQueue对象2. 添加元素到队列3. 获取队列中的元素4. 遍历队列SynchronousQueue队列…

Unity Lighting -- Unity的光源简介

在主菜单栏中&#xff0c;点击Window -> Rendering -> Light Explorer打开光源管理器&#xff0c;这个标签页可以看到场景中所有的光源&#xff0c;包括每个光源的类型&#xff0c;形状&#xff0c;模式&#xff0c;颜色&#xff0c;强度&#xff0c;阴影等信息。 在主菜…

android unit test mock框架使用记录

写在前面 之前上班时&#xff0c;开发一个功能之后&#xff0c;还需要编写测试用例&#xff0c;使用的框架是mock。 为什么防止以后用到时忘了&#xff0c;在这里记录一下。 由于团队没有人使用Espresso进行unit test&#xff0c;所以本人对该框架并不熟悉。想了解该框架的使用…

WPF布局控件之DockPanel

DockPanel DockPanel&#xff0c;英文释义为停靠面板&#xff0c;那是怎么个停靠法呢&#xff1f;如下&#xff1a; <Window x:Class"LearnLayout.DockPanelWin"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http:/…

数字图像处理

文章目录图像复原上升阶跃边缘、下降阶跃边缘、脉冲状边缘和屋顶状边缘曲线及其一阶导数和二阶导数有哪些特征&#xff1f;Hough变换的基本思想是什么&#xff1f;基本概念图像增强灰度变换直方图&#xff1a;直方图特点matlab代码空间域滤波平滑空间滤波均值滤波器&#xff1a…

python如何实现多线程

今天本来打算学习学习多进程的&#xff0c;但是由于我现在的电脑没有Linux系统&#xff0c;无法通过Linux系统编辑一些多进程的程序&#xff0c;因此我打算从多线程入手。 多线程 我们的程序一般都是多任务的&#xff0c;如果你没有好好的利用好&#xff0c;运行时就会出现卡…

【读论文】TCL: an ANN-to-SNN Conversion with Trainable Clipping Layers

DAC 2021 背景 通过ANN2SNN的方法得到的SNN中&#xff0c;存在准确性和延迟之间的一种权衡关系&#xff0c;在较大的数据集&#xff08;如ImageNet&#xff09;上可能会有较高的延迟。 主要贡献 分析了转换后SNN精度与延迟之间存在权衡关系的原因&#xff0c;并指出了如何缓…

6587: 计算分段函数

描述本题目要求计算下列分段函数f(x)的值&#xff1a;输入输入在一行中给出实数x。输出在一行中按“f(x) result”的格式输出&#xff0c;其中x与result都保留两位小数。样例输入10样例输出f(10.00) 3.16提示C/C可在头文件中包含math.h&#xff0c;并调用sqrt函数求平方根&am…

JAVA入门教程||Java Scanner 类||Java 异常处理

Java Scanner 类 java.util.Scanner是Java5的新特征&#xff0c;我们可以通过 Scanner 类来获取用户的输入。 下面是创建 Scanner 对象的基本语法&#xff1a; Scanner s new Scanner(System.in); 接下来我们演示一个最简单的的数据输入&#xff0c;并通过 Scanner 类的 nex…

产品分析丨豆瓣APP

本文将从以下几个方面进行分析&#xff1a;1. 产品功能结构2. 竞品分析3. 用户分析4. 用户调研5. 功能分析与优化方案6. 总结01 产品功能结构产品架构由豆瓣的产品架构图可看出&#xff0c;豆瓣是兼具书影音的评分系统和兴趣社区&#xff0c;以广告、知识付费和电商业务作为商业…

图解LeetCode——剑指 Offer 52. 两个链表的第一个公共节点

一、题目 输入两个链表&#xff0c;找出它们的第一个公共节点。 二、示例 如下面的两个链表&#xff1a; 在节点 c1 开始相交。 注意&#xff1a; 如果两个链表没有交点&#xff0c;返回 null.在返回结果后&#xff0c;两个链表仍须保持原有的结构。可假定整个链表结构中没…

代码质量与安全 | ChatGPT能帮到你什么还有待探索,但人工智能真的可以帮你做自动化测试

当听到“人工智能”&#xff08;AI&#xff09;时&#xff0c;你会想到什么&#xff1f; 你可能会开始想象科幻电影中的先进的人形机器人或者未来科技&#xff0c;但是&#xff0c;人工智能聊天机器人程序Chat GPT的爆火已经证明&#xff0c;这种“未来主义”技术已经融入了我…

三个月自学自动化测试,薪资15K直接翻倍,鬼知道我经历了什么····

学习软件测试是迫不得已&#xff0c;幸好最后通过自己的付出&#xff0c;得到了满意的回报。希望大家能通过我的经历得到一些帮助和思路。 零基础自学遇到的第一个难题就是需要怎么学&#xff0c;刚开始一头雾水&#xff0c;只能先从网上买些书来看&#xff0c;但是收效甚微。…

Unity中获取地形的法线

序之前&#xff0c;生成了地形图&#xff1a;(42条消息) 从灰度图到地形图_averagePerson的博客-CSDN博客那末&#xff0c;地形的法线贴图怎么获取&#xff1f;大概分为两个部分吧&#xff0c;先拿到法线数据&#xff0c;再画到纹理中去。关于法线计算Unity - Scripting API: M…

第4讲 cameraserver.rc详解(下)

本讲是Android Camera Native Framework专题的第4讲&#xff0c;我们介绍cameraserver.rc详解&#xff08;下&#xff09;&#xff0c;包括如下内容&#xff1a;Android init语言简介cameraserver.rc详解serviceuser选项group选项ioprio选项task_profiles选项rlimit选项更多&am…

领域自适应 DA Domain Adaptation

领域自适应是与机器学习和转移学习相关的领域。 当我们的目标是从源数据分布中学习在不同&#xff08;但相关&#xff09;的目标数据分布上的良好性能模型时&#xff0c;就会出现这种情况。 例如&#xff0c;常见垃圾邮件过滤问题的任务之一在于使模型从一个用户&#xff08;源…

2023年金三银四必备软件测试常见面试题1500问!!!【测试思维篇】

五、测试思维5.1 打电话功能怎么去测&#xff1f;我们会从几个方面去测试&#xff1a;界面、功能、兼容性、易用性、安全、性能、异常。1&#xff09;界面我们会测试下是否跟界面原型图一致&#xff0c;考虑浏览器不同显示比例&#xff0c;屏幕分辨率。2&#xff09;功能&#…