豆包大模型 MarsCode AI 刷题专栏 001

001.找单独的数

难度:易

问题描述

在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。

要求:

  1. 设计一个算法,使其时间复杂度为 O(n),其中 n 是班级的人数。
  2. 尽量减少额外空间的使用,以体现你的算法优化能力。

测试样例

样例1:

输入:cards = [1, 1, 2, 2, 3, 3, 4, 5, 5]
输出:4
解释:拿到数字 4 的同学是唯一一个没有配对的。

样例2:

输入:cards = [0, 1, 0, 1, 2]
输出:2
解释:数字 2 只出现一次,是独特的卡片。

样例3:

输入:cards = [7, 3, 3, 7, 10]
输出:10
解释:10 是班级中唯一一个不重复的数字卡片。

约束条件

  • 1 ≤ cards.length ≤ 1001
  • 0 ≤ cards[i] ≤ 1000
  • 班级人数为奇数
  • 除了一个数字卡片只出现一次外,其余每个数字卡片都恰好出现两次

思路提示

要解决这个问题,我们可以利用异或(XOR)运算的特性。异或运算有以下几个关键性质:

  1. 相同数字异或结果为0a ^ a = 0
  2. 任何数字与0异或结果为该数字本身a ^ 0 = a
  3. 异或运算满足交换律和结合律a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b

基于这些性质,我们可以设计一个算法来找到那个唯一的独特数字:

解题思路

  1. 初始化一个变量 unique_number 为0。
  2. 遍历数组中的每一个数字,将 unique_number 与当前数字进行异或运算。
  3. 最终unique_number 将只包含那个独特的数字,因为所有成对的数字都会通过异或运算相互抵消。

算法步骤

  1. 初始化 unique_number = 0
  2. 遍历数组 cards 中的每一个数字 card
    • 更新 unique_number 为 unique_number ^ card
  3. 返回 unique_number

时间复杂度

  • **O(n)**:我们只需要遍历数组一次。

空间复杂度

  • **O(1)**:我们只使用了常数级别的额外空间。

通过这种方式,我们可以在不使用额外空间的情况下,以线性时间复杂度找到那个独特的数字。


MarsCode AI答案

Python:

def solution(cards):# 初始化结果变量为0result = 0# 遍历数组中的每一个元素for card in cards:# 将结果与当前元素进行异或运算result ^= card# 返回最终结果return resultif __name__ == "__main__":# 添加你的测试用例print(solution([1, 1, 2, 2, 3, 3, 4, 5, 5]) == 4)print(solution([0, 1, 0, 1, 2]) == 2)

Go:

package mainimport "fmt"func solution(cards []int) int {result := 0for _, card := range cards {result ^= card}return result
}func main() {fmt.Println(solution([]int{1, 1, 2, 2, 3, 3, 4, 5, 5}) == 4)fmt.Println(solution([]int{0, 1, 0, 1, 2}) == 2)fmt.Println(solution([]int{7, 3, 3, 7, 10}) == 10)
}

Rust:

fn solution(cards: Vec<i32>) -> i32 {// 使用异或运算来找到唯一的数字let mut unique_number = 0;for &card in &cards {unique_number ^= card;}unique_number
}fn main() {// 添加你的测试用例println!("{}", solution(vec![1, 1, 2, 2, 3, 3, 4, 5, 5]) == 4);println!("{}", solution(vec![0, 1, 0, 1, 2]) == 2);println!("{}", solution(vec![7, 3, 3, 7, 10]) == 10);
}

 

002.徒步旅行中的补给问题

难度:中

问题描述

小R正在计划一次从地点A到地点B的徒步旅行,总路程需要 N 天。为了在旅途中保持充足的能量,小R每天必须消耗1份食物。幸运的是,小R在路途中每天都会经过一个补给站,可以先购买完食物后再消耗今天的1份食物。然而,每个补给站的食物每份的价格可能不同,并且小R在购买完食物后最多只能同时携带 K 份食物。

现在,小R希望在保证每天食物消耗的前提下,以最小的花费完成这次徒步旅行。你能帮助小R计算出最低的花费是多少吗?

**输入 **

  • n 总路程需要的天数
  • k 小R最多能同时携带食物的份数
  • data[i] 第i天补给站每份食物的价格

**输出 **

  • 返回完成这次徒步旅行的最小花费

**约束条件 **

  • 1 < n,k < 1000
  • 1 < data[i] < 10000

测试样例

样例1:

输入:n = 5 ,k = 2 ,data = [1, 2, 3, 3, 2]
输出:9

样例2:

输入:n = 6 ,k = 3 ,data = [4, 1, 5, 2, 1, 3]
输出:9

样例3:

输入:n = 4 ,k = 1 ,data = [3, 2, 4, 1]
输出:10

问题理解

小R每天需要消耗1份食物,并且每天经过一个补给站,可以购买食物。小R最多能携带 K 份食物。我们需要找到一种策略,使得小R在旅途中花费最少。

数据结构选择

我们可以使用一个数组来存储每天的食物价格,并且使用一个变量来记录当前携带的食物数量。

算法步骤

  1. 初始化

    • 设置一个变量 current_food 表示当前携带的食物数量,初始为0。
    • 设置一个变量 total_cost 表示总花费,初始为0。
  2. 遍历每一天

    • 如果当前携带的食物数量 current_food 大于0,则消耗1份食物。
    • 如果当前携带的食物数量 current_food 为0,则需要购买食物。
    • 在购买食物时,需要考虑当前补给站的价格和未来几天的价格,以决定购买多少份食物。
  3. 购买策略

    • 在购买食物时,应该尽量购买未来几天价格较低的食物,以减少总花费。
    • 可以使用一个滑动窗口来找到未来几天内的最低价格,并决定购买的数量。

思路说明

题目要求在给定的天数 N 和最大携带食物量 K 的限制下,计算出完成徒步旅行所需的最小花费。每天经过的补给站食物价格不同,且每天必须消耗1份食物。我们可以通过维护一个单调递增的双端队列来记录当前窗口内的最小价格,从而在每次购买食物时选择最便宜的选项。通过滑动窗口的方式,逐步计算出每天的最小花费,最终得到总的最小花费。

解题过程

  1. 初始化:创建一个双端队列 mins 用于存储当前窗口内的最小价格及其对应的天数。初始化结果 result 为0。
  2. 遍历每一天
    • 维护单调队列:在每次遍历中,首先检查队列 mins 的末尾元素,如果其价格大于当前天的价格,则将其弹出,直到队列为空或队列末尾元素的价格小于等于当前天的价格。然后将当前天的价格和天数加入队列。
    • 滑动窗口:检查队列 mins 的头部元素,如果其对应的天数已经不在当前窗口内(即 mins[0][0] <= j - k),则将其弹出。
    • 计算花费:将当前窗口内的最小价格(即队列头部元素的价格)累加到 result 中。
  3. 返回结果:遍历结束后,result 即为完成徒步旅行的最小花费。

复杂度分析

  • 时间复杂度:O(N),其中 N 是天数。我们只需要遍历每一天,并且在每次遍历中,队列的插入和删除操作都是 O(1) 的时间复杂度。
  • 空间复杂度:O(K),其中 K 是最大携带食物量。我们使用了一个双端队列来存储当前窗口内的最小价格,其最大长度为 K。

知识点扩展

  • 双端队列(deque):双端队列是一种允许在两端进行插入和删除操作的队列。在本题中,我们使用双端队列来维护当前窗口内的最小价格,通过在队列两端进行操作,可以高效地维护单调性。
  • 单调队列:单调队列是一种特殊的队列,其内部元素保持单调递增或单调递减的顺序。在本题中,我们使用单调递增队列来记录当前窗口内的最小价格,从而在每次购买食物时选择最便宜的选项。
  • 滑动窗口:滑动窗口是一种常见的算法技巧,用于在数组或列表中维护一个固定大小的窗口,并对其进行操作。在本题中,我们通过滑动窗口的方式,逐步计算出每天的最小花费。

MarsCode AI答案

Python:

from collections import dequedef solution(n: int, k: int, data: list) -> int:assert n == len(data)assert k < nmins = deque()result = 0for j in range(n):while len(mins) > 0 and mins[-1][1] > data[j]:mins.pop()mins.append([j, data[j]])while mins[0][0] <= j - k:mins.popleft()result += mins[0][1]return resultif __name__ == '__main__':print(solution(n = 5 ,k = 2 ,data = [1, 2, 3, 3, 2]) == 9)print(solution(n = 6 ,k = 3 ,data = [4, 1, 5, 2, 1, 3]) == 9)print(solution(n = 4 ,k = 1 ,data = [3, 2, 4, 1]) == 10)

Go:

package mainimport ("fmt""math"
)func solution(n int, k int, data []int) int {// 初始化dp数组,dp[i]表示在第i天结束时的最小花费dp := make([]int, n+1)for i := 1; i <= n; i++ {dp[i] = math.MaxInt32 // 初始化为一个很大的值}dp[0] = 0 // 第0天不需要花费// 填充dp数组for i := 1; i <= n; i++ {for j := i - 1; j >= max(0, i-k); j-- {// 计算在第j天购买食物,然后走到第i天的总花费cost := dp[j] + data[i-1] * (i - j)if cost < dp[i] {dp[i] = cost}}}return dp[n]
}func max(a, b int) int {if a > b {return a}return b
}func main() {fmt.Println(solution(5, 2, []int{1, 2, 3, 3, 2}) == 9)fmt.Println(solution(6, 3, []int{4, 1, 5, 2, 1, 3}) == 9)fmt.Println(solution(4, 1, []int{3, 2, 4, 1}) == 10)
}

Rust:

use std::collections::VecDeque;fn solution(n: usize, k: usize, data: Vec<usize>) -> usize {assert_eq!(n, data.len());assert!(k < n);let mut mins: VecDeque<(usize, usize)> = VecDeque::new();let mut result = 0;for j in 0..n {while let Some(&(_, price)) = mins.back() {if price > data[j] {mins.pop_back();} else {break;}}mins.push_back((j, data[j]));while let Some(&(index, _)) = mins.front() {if index <= j.saturating_sub(k) {mins.pop_front();} else {break;}}result += mins.front().unwrap().1;}result
}fn main() {println!("{}", solution(5, 2, vec![1, 2, 3, 3, 2]) == 9);println!("{}", solution(6, 3, vec![4, 1, 5, 2, 1, 3]) == 9);println!("{}", solution(4, 1, vec![3, 2, 4, 1]) == 10);
}

代码解释

  1. VecDeque: Rust中的VecDeque类似于Python中的deque,支持高效的头部和尾部操作。
  2. assert_eq! 和 assert!: Rust中的断言函数,用于确保输入的合法性。
  3. while let: Rust中的模式匹配语法,用于简化循环条件。
  4. saturating_sub: Rust中的饱和减法,防止下溢。

来源:https://www.marscode.cn/practice

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

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

相关文章

Spring Boot 消息队列(以RabbitMQ为例)

文章目录 RabbitMQ 简介与安装1. RabbitMQ 简介2. RabbitMQ 安装 Spring Boot 集成 RabbitMQ1. 创建 Spring Boot 项目2. 配置 RabbitMQ3. 定义消息队列和交换机4. 发送消息5. 接收消息6. 测试消息发送和接收 RabbitMQ 简介与安装 1. RabbitMQ 简介 RabbitMQ 是一个开源的消息…

C++ Boost库中Chrono时间模块的基本使用

以下是关于 Boost Chrono 库的常见操作及使用示例&#xff1a; 1. 基本概念 Boost Chrono 提供时间相关的工具&#xff0c;包括&#xff1a; 时钟&#xff08;Clocks&#xff09;&#xff1a;系统时钟、高精度时钟等。时间点&#xff08;Time Points&#xff09;&#xff1a;…

高效便捷的 Spring Boot 通用控制器框架

✨高效便捷的 Spring Boot 通用控制器框架✨ 一、简介 在 Java 开发中&#xff0c;重复性的基础接口编写工作常令人头疼。本框架基于 Spring Boot 与 MyBatis-Plus&#xff0c;精心构建通用控制器类BaseController&#xff0c;旨在为开发者排忧解难&#xff0c;极大减少繁琐的…

【蓝桥杯集训·每日一题2025】 AcWing 5539. 牛奶交换 python

AcWing 5539. 牛奶交换 Week 3 3月6日 题目描述 农夫约翰的 N N N 头奶牛排成一圈&#xff0c;使得对于 1 , 2 , … , N − 1 1,2,…,N−1 1,2,…,N−1 中的每个 i i i&#xff0c;奶牛 i i i 右边的奶牛是奶牛 i 1 i1 i1&#xff0c;而奶牛 N N N 右边的奶牛是奶牛 …

MacOS Big Sur 11 新机安装brew wget python3.12 exo

MacOS Big Sur 11,算是很老的系统了&#xff0c;所以装起来有点费劲。 首先安装brew 按照官网的方法&#xff0c;直接执行下面语句即可安装&#xff1a; export HOMEBREW_BREW_GIT_REMOTE"https://githubfast.com" # put your Git mirror of Homebrew/brew here …

【四.RAG技术与应用】【12.阿里云百炼应用(下):RAG的云端优化与扩展】

在上一篇文章中,我们聊了如何通过阿里云百炼平台快速搭建一个RAG(检索增强生成)应用,实现文档智能问答、知识库管理等基础能力。今天咱们继续深入,聚焦两个核心问题:如何通过云端技术优化RAG的效果,以及如何扩展RAG的应用边界。文章会穿插实战案例,手把手带你踩坑避雷。…

thingsboard edge 在windows 环境下的配置

按照官方文档&#xff1a;Installing ThingsBoard Edge on Windows | ThingsBoard Edge&#xff0c;配置好java环境和PostgreSQL。 下载对应的windows 环境下的tb-edge安装包。下载附件 接下来操作具体如下 步骤1&#xff0c;需要先在thingsboard 服务上开启edge 权限 步骤2…

vue实现一个pdf在线预览,pdf选择文本并提取复制文字触发弹窗效果

[TOC] 一、文件预览 1、安装依赖包 这里安装了disjs-dist2.16版本&#xff0c;安装过程中报错缺少worker-loader npm i pdfjs-dist2.16.105 worker-loader3.0.8 2、模板部分 <template><div id"pdf-view"><canvas v-for"page in pdfPages&qu…

vue3页面html导出word文档

一、第三方包下载 使用npm下载以下插件&#xff1a; npm install jszip-utils docxtemplater pizzip file-saver docxtemplater-image-module-free 二、总页面组件代码 <template> <summaryDetails :securityId"securityId" :symbol"symbol" …

基于 STC89C52 的 8x8 点阵显示数字

一、引言 在电子设计领域,信息的有效展示是众多项目的关键环节。8x8 点阵作为一种经济且实用的显示模块,能够呈现数字、简单字母及图形等信息,在电子时钟、简易游戏机等产品中广泛应用。STC89C52 单片机凭借其低成本、丰富的 I/O 资源与稳定的性能,成为驱动 8x8 点阵的理想…

MWC 2025|紫光展锐联手美格智能发布5G通信模组SRM812

在2025年世界移动通信大会&#xff08;MWC 2025&#xff09;期间&#xff0c;紫光展锐携手美格智能正式推出了基于紫光展锐V620平台的第二代5G Sub6G R16模组SRM812&#xff0c;以超高性价比方案&#xff0c;全面赋能合作伙伴&#xff0c;加速5G规模化应用在各垂直领域的全面落…

leetcode700-二叉搜索树中的搜索

leetcode 700 思路 我们需要先了解一下二叉搜索树的特性&#xff1a; 左子树的所有节点值 < 当前节点的值。右子树的所有节点值 > 当前节点的值。这个特性适用于树中的每个节点 那么根据这个特性&#xff0c;我们可以通过根节点的值和目标值的大小来判断后序的走向&…

算法之二维装水问题

目录 1. 题目2. 解释3. 思路4. 代码5. 总结 1. 题目 给定一个数组arr&#xff0c;已知其中所有的值都是非负的&#xff0c;将这个数组看作一个容器&#xff0c;请返回容器能装多少水 比如&#xff0c;arr {3&#xff0c;1&#xff0c;2&#xff0c;5&#xff0c;2&#xff0c…

SAP FI财务凭证冲销

冲销调用FUNCTION FI_REFERENCE_CREATE实现 主要参数&#xff1a;冲销凭证&#xff0c;会计年度&#xff0c;公司代码。冲销原因&#xff0c;本期冲销还是上期冲销期间的选择。 FUNCTION ZFIFM_XXXX. *"---------------------------------------------------------------…

【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-附录D-JavaScript 工具

附录D、JavaScript 工具 JavaScript 工具 编写 JavaScript 代码与编写其他编程语言代码类似&#xff0c;都有专门的工具帮助提高开发效率。JavaScript开发者可以使用的工具一直在增加&#xff0c;这些工具可以帮助开发者更容易定位问题、优化代码和部署上线。其中有些工具是在 …

【AI学习从零至壹】Pytorch逻辑回归

Pytorch逻辑回归 线性回归简单线性回归的参数估计概率和似然的区别 最⼤似然估计似然函数对数似然函数 逻辑回归梯度下降法下⼭问题梯度与学习率学习率 梯度下降法的模拟与可视化学习率对梯度的影响学习率的最佳取值 梯度更新逻辑回归模型构建及训练流程 线性回归 线性回归的⽬…

mybatisplus 开发流程

目录 什么是mybatisplus&#xff1f; 创建项目 先创建一个简单的Java项目​编辑 引入依赖 1.引入父依赖 2.引入其他依赖 springboot配置 application.yml qppication-dev.yml 创建包 实体类 映射&#xff08;创建一个接口&#xff09; 构建测试环境 进行方法的实…

使用 uniapp 开发标准体重计算小程序

引言 在现代生活中&#xff0c;健康管理越来越受到重视&#xff0c;而体重是衡量健康状况的重要指标之一。为了方便用户快速计算自己的标准体重并了解体重状态&#xff0c;我使用 uniapp 开发了一款简单的标准体重计算小程序。本文将详细介绍开发过程&#xff0c;并分享核心代…

如何使用SSH命令安全连接并转发端口到远程服务器

ssh -p 22546 rootconnect.westc.gpuhub.com d6IS/mQKq/iG ssh -CNgv -L 6006:127.0.0.1:6006 rootconnect.westc.gpuhub.com -p 22546 第一条命令&#xff1a;用于登录远程服务器&#xff0c;进行交互式操作。第二条命令&#xff1a;用于建立 SSH 隧道&#xff0c;进行端口转…

File文件和目录

一、文件和目录相关概念 计算机文件&#xff08;File&#xff09;:以计算机硬盘为载体存储在计算机上的信息集合,可以是文本&#xff08;.txt&#xff09;、图片(.jpg、.png、.jpeg)、视频(.mp4)、程序(.exe)等&#xff0c;文件一般有拓展名&#xff0c;表示文件的类型。 文件…