【LeetCode每日一题合集】2023.10.9-2023.10.15(贪心⭐位运算的应用:只出现一次的数字)

news2024/11/16 15:38:03

文章目录

  • 2578. 最小和分割(贪心)
  • 2731. 移动机器人(脑筋急转弯+排序统计)
  • 2512. 奖励最顶尖的 K 名学生(哈希表+排序)(练习Java语法)
    • 代码风格1
    • 代码风格2
  • 2562. 找出数组的串联值(简单模拟)
    • 写法1——模拟
    • 写法2——String、Integer 的 API
  • 1488. 避免洪水泛滥⭐
    • 解法1——贪心+优先队列
    • 解法2——贪心+二分查找
      • 补充:TreeSet的ceiling()和floor()
  • 136. 只出现一次的数字(异或的应用)
  • 137. 只出现一次的数字 II⭐(位运算)
    • 解法1——依次确定二进制的每一位
    • 解法2——数字电路设计🚹

2578. 最小和分割(贪心)

https://leetcode.cn/problems/split-with-minimum-sum/?envType=daily-question&envId=2023-10-09

在这里插入图片描述

分给两个数字,两个数字的位数越接近越好。
除此之外,数字越大就放在越靠后的位置即可。

class Solution {
    public int splitNum(int num) {
        List<Integer> ls = new ArrayList<>();
        while (num != 0) {
            ls.add(num % 10);
            num /= 10;
        }
        Collections.sort(ls);
        int n = ls.size(), ans = 0;
        for (int i = 0, t = 1; i < n; ++i) {
            ans += ls.get(n - 1 - i) * t;
            if (i % 2 == 1) t *= 10;
        }
        return ans;
    }
}

2731. 移动机器人(脑筋急转弯+排序统计)

https://leetcode.cn/problems/movement-of-robots/description/?envType=daily-question&envId=2023-10-10

在这里插入图片描述

提示:

2 <= nums.length <= 10^5
-2 * 10^9 <= nums[i] <= 2 * 10^9
0 <= d <= 10^9
nums.length == s.length
s 只包含 'L' 和 'R' 。
nums[i] 互不相同。

两个机器人相碰之后可以认为是相互代替了对方。

class Solution {
    public int sumDistance(int[] nums, String s, int d) {
        final int MOD = (int)1e9 + 7;
        int n = nums.length;
        long[] p = new long[n];
        for (int i = 0; i < n; ++i) {
            if (s.charAt(i) == 'L') p[i] = nums[i] - d;
            else p[i] = nums[i] + d;
        }
        Arrays.sort(p);
        long ans = 0, sum = 0;
        for (int i = 1; i < n; ++i) {
            long x = p[i] - p[i - 1];
            sum = (sum + x * i) % MOD;
            ans = (ans + sum) % MOD;
        }
        return (int)ans;
    }
}

2512. 奖励最顶尖的 K 名学生(哈希表+排序)(练习Java语法)

https://leetcode.cn/problems/reward-top-k-students/description/?envType=daily-question&envId=2023-10-11

在这里插入图片描述

在这里插入图片描述

代码风格1

class Solution {
    public List<Integer> topStudents(String[] positive_feedback, String[] negative_feedback, String[] report, int[] student_id, int k) {
        Map<String, Integer> words = new HashMap<>();
        for (String word: positive_feedback) words.put(word, 3);
        for (String word: negative_feedback) words.put(word, -1);

        int n = report.length;
        int[] scores = new int[n];
        int[][] stus = new int[n][2];
        for (int i = 0; i < n; ++i) {
            int s = 0;
            for (String w: report[i].split(" ")) s += words.getOrDefault(w, 0);
            stus[i] = new int[]{s, student_id[i]};
        }
        Arrays.sort(stus, (a, b) -> {
            return a[0] != b[0]? b[0] - a[0]: a[1] - b[1];
        });
        List<Integer> ans = new ArrayList<>();
        for (int i = 0; i < k; ++i) ans.add(stus[i][1]);
        return ans;
    }
}

代码风格2

class Solution {
    Set<String> pos, neg;

    public List<Integer> topStudents(String[] positive_feedback, String[] negative_feedback, String[] report, int[] student_id, int k) {
        int n = student_id.length;
        pos = new HashSet<>(Arrays.stream(positive_feedback).collect(Collectors.toSet()));
        neg = new HashSet<>(Arrays.stream(negative_feedback).collect(Collectors.toSet()));
        List<Integer> ans = new ArrayList<>();
        Map<Integer, Integer> s = new HashMap<>();      // 计算分数
        for (int i = 0; i < n; ++i) {
            s.merge(student_id[i], cp(report[i]), Integer::sum);
        }
        List<Integer> sId = Arrays.stream(student_id).boxed().collect(Collectors.toList());
        Collections.sort(sId, (x, y) -> {
            int a = s.getOrDefault(x, 0), b = s.getOrDefault(y, 0);
            if (a != b) return b - a;
            return x - y;
        });
        for (int i = 0; i < k; ++i) ans.add(sId.get(i));
        return ans;
    }

    public int cp(String r) {
        String[] ws = r.split(" ");
        int res = 0;
        for (String w: ws) {
            if (pos.contains(w)) res += 3;
            else if (neg.contains(w)) res -= 1;
        }
        return res;
    }
}

2562. 找出数组的串联值(简单模拟)

https://leetcode.cn/problems/find-the-array-concatenation-value/description/?envType=daily-question&envId=2023-10-12

在这里插入图片描述

提示:
1 <= nums.length <= 1000
1 <= nums[i] <= 10^4

写法1——模拟

class Solution {
    public long findTheArrayConcVal(int[] nums) {
        long ans = 0;
        for (int l = 0, r = nums.length - 1; l <= r; ++l, --r) {
            if (l != r) {
                ans += op(nums[l], nums[r]);
            } else {
                ans += nums[l];
            }
        }
        return ans;
    }

    public int op(int a, int b) {
        int t = b;
        while (t != 0) {
            a *= 10;
            t /= 10;
        }
        return a + b;
    }
}

写法2——String、Integer 的 API

class Solution {
    public long findTheArrayConcVal(int[] nums) {
        long ans = 0;
        for (int i = 0, j = nums.length - 1; i <= j; i++, j--) {
            if (i != j) {
                ans += Integer.parseInt(Integer.toString(nums[i]) + Integer.toString(nums[j]));
            } else {
                ans += nums[i];
            }
        }
        return ans;
    }
}

1488. 避免洪水泛滥⭐

https://leetcode.cn/problems/avoid-flood-in-the-city/description/?envType=daily-question&envId=2023-10-13

在这里插入图片描述

提示:

1 <= rains.length <= 10^5
0 <= rains[i] <= 10^9

解法1——贪心+优先队列

https://leetcode.cn/problems/avoid-flood-in-the-city/solutions/303095/tan-xin-you-xian-dui-lie-he-xin-si-lu-yi-ju-hua-by/?envType=daily-question&envId=2023-10-13

每当一个湖泊下雨时,将其下一个下雨的下标存入优先队列中。
这样当可以排水时,可以O(1)取出下一个最需要排水的湖泊。

class Solution {
    public int[] avoidFlood(int[] rains) {
        int n = rains.length;
        int[] ans = new int[n];
        Set<Integer> s = new HashSet<>();                   // 存储已经有水的湖泊
        Map<Integer, Deque<Integer>> m = new HashMap<>();   // 湖编号=>下雨日期双端队列
        for (int i = 0; i < n; ++i) {
            int r = rains[i];
            if (r > 0) {
                if (!m.containsKey(r)) m.put(r, new ArrayDeque<Integer>());
                m.get(r).offerLast(i);
            }
        }
        PriorityQueue<Integer> pq = new PriorityQueue<>();  // 优先队列,下一个最需要被排水的湖泊编号
        for (int i = 0; i < n; ++i) {
            if (rains[i] > 0) {
                if (s.contains(rains[i])) {
                    return new int[]{};     // 已经有水了,不能避免
                } else {
                    ans[i] = -1;
                    s.add(rains[i]);        
                    m.get(rains[i]).pollFirst();
                    if (!m.get(rains[i]).isEmpty()) pq.offer(m.get(rains[i]).peekFirst());
                }
            } else {
                if (pq.isEmpty()) ans[i] = 1;
                else {
                    int idx = pq.poll();
                    ans[i] = rains[idx];
                    s.remove(rains[idx]);
                }
            }
        }
        return ans;
    }
}

解法2——贪心+二分查找

https://leetcode.cn/problems/avoid-flood-in-the-city/solutions/2472026/bi-mian-hong-shui-fan-lan-by-leetcode-so-n5c9/?envType=daily-question&envId=2023-10-13
我们总是在最早的晴天日子中进行抽干操作,以最大程度地避免洪水的发生。

class Solution {
    public int[] avoidFlood(int[] rains) {
        int n = rains.length;
        TreeSet<Integer> st = new TreeSet<>();      // 记录可用日期
        int[] ans = new int[n];
        Arrays.fill(ans, 1);
        Map<Integer, Integer> last = new HashMap<>();// 记录各个湖泊上一个下雨的下标
        for (int i = 0; i < n; ++i) {
            if (rains[i] == 0) st.add(i);
            else {
                ans[i] = -1;
                if (last.containsKey(rains[i])) {
                    Integer idx = st.ceiling(last.get(rains[i]));   // 二分查找到最早可用排水的日期
                    if (idx == null) return new int[0];
                    ans[idx] = rains[i];
                    st.remove(idx);
                }
                last.put(rains[i], i);
            }
        }
        return ans;
    }
}

二分查找可以使用 TreeSet 的 ceiling() 方法来实现。

补充:TreeSet的ceiling()和floor()

TreeSet 是 Java 中的一个基于红黑树实现的有序集合类,它提供了一些用于查找元素的方法,包括 ceiling() 和 floor() 方法。这两个方法用于查找与指定元素最接近的元素,但有一些差异。

ceiling(E e) 方法
ceiling(E e) 方法返回集合中大于等于指定元素 e 的最小元素,或者如果不存在这样的元素,则返回 null。
如果存在等于 e 的元素,它也会返回这个元素。

floor(E e) 方法
floor(E e) 方法返回集合中小于等于指定元素 e 的最大元素,或者如果不存在这样的元素,则返回 null。
如果存在等于 e 的元素,它也会返回这个元素。

136. 只出现一次的数字(异或的应用)

https://leetcode.cn/problems/single-number/description/?envType=daily-question&envId=2023-10-14
在这里插入图片描述

提示:
1 <= nums.length <= 3 * 10^4
-3 * 104 <= nums[i] <= 3 * 10^4
除了某个元素只出现一次以外,其余每个元素均出现两次。

class Solution {
    public int singleNumber(int[] nums) {
        int ans = 0;
        for (int num: nums) ans ^= num;
        return ans;
    }
}

137. 只出现一次的数字 II⭐(位运算)

https://leetcode.cn/problems/single-number-ii/description/?envType=daily-question&envId=2023-10-15

在这里插入图片描述

解法1——依次确定二进制的每一位

在这里插入图片描述

class Solution {
    public int singleNumber(int[] nums) {
        int ans = 0;
        for (int i = 0; i < 32; ++i) {						// 枚举每一位
            int total = 0;
            for (int x: nums) total += ((x >> i) & 1);		// 枚举每个数字
            if (total % 3 == 1) ans |= 1 << i; 
        }
        return ans;
    }
}

解法2——数字电路设计🚹

略,见:https://leetcode.cn/problems/single-number-ii/solutions/746993/zhi-chu-xian-yi-ci-de-shu-zi-ii-by-leetc-23t6/

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

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

相关文章

基于Linux的驱动开发:内核模块传参、内核到处符号表、字符设备驱动

内核模块传参 内核模块&#xff1a; int a , b; 安装内核模块时&#xff1a;insmod demo.ko a 100 b 10; 1.内核模块传参的意义 在安装内核模块时给内核模块中的变量进行数值传递&#xff0c;这样可以让我们的内核模块向上兼容更为复杂的应用程序&#xff0c;向下适配多种硬件…

网络协议--ARP:地址解析协议

4.1 引言 本章我们要讨论的问题是只对TCP/IP协议簇有意义的IP地址。数据链路如以太网或令牌环网都有自己的寻址机制&#xff08;常常为48 bit地址&#xff09;&#xff0c;这是使用数据链路的任何网络层都必须遵从的。一个网络如以太网可以同时被不同的网络层使用。例如&#…

解剖—单链表相关OJ练习题

目录 一、移除链表元素 二、找出链表的中间节点 三、合并两个有序链表 四、反转链表 五、求链表中倒数第k个结点 六、链表分割 七、链表的回文结构 八、判断链表是否相交 九、判断链表中是否有环(一) 十、 判断链表中是否有环(二) 注&#xff1a;第六题和第七题牛…

三网话费余额查询的API系统 基于thinkphp6.0框架

本套系统是用thinkphp6.0框架开发的&#xff0c;PHP需大于8.2&#xff0c;系统支持用户中心在线查询和通过API接口对接发起查询&#xff0c;用户余额充值是对接usdt接口&#xff0c;源码全开源&#xff0c;支持懂技术的人二次开发~搭建教程1、源码上传后&#xff0c;吧运行目录…

异常数据检测 | Python基于Hampel的离群点检测

文章目录 文章概述模型描述源码分享文章概述 在时间序列数据分析领域,识别和处理异常点是至关重要的任务。异常点或离群点是明显偏离预期模式的数据点,可能表明存在错误、欺诈或有价值的见解。 应对这一挑战的一种有效技术是汉普尔过滤器(Hampel Filter)。 模型描述 汉…

Manacher学习笔记

Manacher 算法&#xff0c;俗称马拉车算法&#xff0c;是一种解决最长回文子串问题的算法。 在 Ybt 的哈希章节中出现了这个&#xff1a; 数据范围 1 0 6 10^6 106&#xff0c;数据相对于马拉车模板较弱。 对于一个普通的字符串&#xff0c;我们要想求出它的回文子串需要考虑它…

聊天机器人语料在开发中的重要性

语料在聊天机器人的开发中起着至关重要的作用&#xff0c;使其能够有效理解和回应用户的查询。语料是聊天机器人的训练数据&#xff0c;通过分析和学习这个语料&#xff0c;聊天机器人可以提高对用户意图的准确理解&#xff0c;并生成恰当的回应。 | 一、聊天机器人语料好在哪&…

Unity 单例-接口模式

单例-接口模式 使用接口方式实现的单例可以继承其它类&#xff0c;更加方便 using System.Collections; using System.Collections.Generic; using UniRx; using UniRx.Triggers; using UnityEngine; namespace ZYF {public interface ISingleton<TMono> where TMono : M…

Redis-Sentinel高可用架构学习

Redis-Sentinel高可用架构 Redis主从复制过程&#xff1a; 主从同步原理 Redis Sentinel&#xff08;哨兵&#xff09;高可用集群方案&#xff1a;Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案。 当用Redis做Master-slave的高可用方案时&#xff0c;假如master宕机了…

微信小程序之后台首页交互

目录 一.与后台数据进行交互&request封装 后台准备 测试结果 ​编辑 前端 测试结果 二.wxs的介绍以及入门 测试结果 一.与后台数据进行交互&request封装 后台准备 pom.xml文件编写 <?xml version"1.0" encoding"UTF-8"?> <proj…

【JavaEE】常见的锁策略 -- 多线程篇(4)

文章目录 乐观锁 vs 悲观锁读写锁重量级锁 vs 轻量级锁自旋锁&#xff08;Spin Lock&#xff09;公平锁 vs 非公平锁可重入锁 vs 不可重入锁 乐观锁 vs 悲观锁 悲观锁: 总是假设最坏的情况&#xff0c;每次去拿数据的时候都认为别人会修改&#xff0c;所以每次在拿数据的时候都…

全连接网络参数Xavier初始化

1.梯度消失 考虑下图的神经网络&#xff0c;在使用梯度下降法迭代更新W_ki和W_ij时&#xff0c;它们的梯度方向间有什么关系&#xff1f; 它们的梯度关系如下&#xff1a; 从上述两个式子我们大致可以看出&#xff0c;损失函数L关于第h层参数的梯度由两部分组成&#xff1a;…

sql server2014如何添加多个实例 | 以及如何删除多个实例中的单个实例

标题sql server2014如何添加多个实例 前提&#xff08;已安装sql server2014 且已有默认实例MSSQLSERVER&#xff09; 添加新的实例 其实就是根据安装步骤再安装一次&#xff08;区别在过程中说明&#xff09; 双击安装 选择“全新独立安装或添加现有功能” 然后下一步下一…

微信小程序开发之后台数据交互及wxs应用

目录 一、后端准备 1. 应用配置 2. 数据源配置 二、数据库 1. 创建 2. 数据表 3. 数据测试 三、前端 1. 请求方法整合 2. 数据请求 3. WXS的使用 4. 样式美化 5. 页面 一、后端准备 通过SpringMVC及mybatis的技术学习&#xff0c;还有前后端分离的技术应用&…

Linux程序地址

目录 一、定义 二、问题引出 三、虚拟地址和物理地址 &#xff08;一&#xff09;问题解释 &#xff08;二&#xff09;什么是进程地址空间 &#xff08;三&#xff09;为什么要有进程地址空间 一、定义 #include <stdio.h> #include <stdlib.h>//geten…

运维监控Zabbix部署

目录 运维监控Zabbix部署 1. 简介 2. 安装 ​编辑 2.1 安装前准备 - Mysql 2.2 安装Zabbix Server 和 Zabbix Agent 2.2.1 安装Zabbix yum库 2.2.2 安装Zabbix Server、前端、Agent 2.2.3 初始化Mysql数据库 2.2.4 为Zabbix Server配置数据库 2.2.5 配置Zab…

【目标检测】Co-DETR:ATSS+Faster RCNN+DETR协作的先进检测器(ICCV 2023)

论文&#xff1a;DETRs with Collaborative Hybrid Assignments Training 代码**&#xff1a;https://github.com/Sense-X/Co-DETR 文章目录 摘要一、简介二、本文方法2.1.概述2.2.协同混合分配训练2.3. 定制的正 Query 生成2.4. Co-DETR为何有效1、丰富编码器的监督2、通过减少…

QEMU DirtyLimit特性介绍

文章目录 背景基本原理PMLDirty-RingDirty-Limit 具体实现数据结构vcpu_dirty_rate_statdirtylimit_state 算法实现接口逻辑qmp_set_vcpu_dirty_limitqmp_cancel_vcpu_dirty_limit 限制算法算法框架理想效果具体实现 测试验证QEMULibvirt 一个广子 背景 热迁移实现逻辑中&…

---图的遍历和最小生成树

广度优先遍历 --- 针对的是顶点遍历 深度优先遍历 如果给的图不是连通图&#xff1f;以某个点为起点就没有遍历完成。那么怎么保证遍历完剩下的点呢&#xff1f;&#xff1f; 在标记数组当中找没有遍历过的点&#xff0c;在进行遍历 最小生成树 生成树&#xff1a;一个连通…

使用TypeScript和jsdom库实现自动化数据抓取

目录 环境准备 使用TypeScript和jsdom抓取数据 总结 随着网络技术的发展&#xff0c;数据抓取已成为获取信息的重要手段。然而&#xff0c;手动进行数据抓取既耗时又容易出错。因此&#xff0c;本文将介绍如何使用TypeScript和jsdom库实现自动化数据抓取。我们将通过创建一个…