豆包大模型 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.rhkb.cn/news/29219.html

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

相关文章

树莓派学习(一)——3B+环境配置与多用户管理及编程实践

树莓派学习&#xff08;一&#xff09;——3B环境配置与多用户管理及编程实践 一、实验目的 掌握树莓派3B无显示器安装与配置方法。学习Linux系统下多用户账号的创建与管理。熟悉在树莓派上使用C语言和Python3编写简单程序的方法。 二、实验环境 硬件设备&#xff1a;树莓派…

DAIR-V2X-R数据集服务器下载

【官方github链接】https://github.com/ylwhxht/V2X-R 点击并登录 选择并点击下载 浏览器弹窗&#xff0c;右键选择复制下载链接 ------------------------------------服务器下载----------------------------------------- 登录服务器&#xff0c;选在要下载的文件夹复制路…

通用信息抽取大模型PP-UIE开源发布,强化零样本学习与长文本抽取能力,全面适配多场景任务

背景与简介 信息抽取&#xff08;information extraction&#xff09;是指&#xff0c;从非结构化或半结构化数据&#xff08;如自然语言文本&#xff09;中自动识别、提取并组织出结构化信息。通常包含多个子任务&#xff0c;例如&#xff1a;命名实体识别&#xff08;NER&am…

前端开发10大框架深度解析

摘要 在现代前端开发中&#xff0c;框架的选择对项目的成功至关重要。本文旨在为开发者提供一份全面的前端框架指南&#xff0c;涵盖 React、Vue.js、Angular、Svelte、Ember.js、Preact、Backbone.js、Next.js、Nuxt.js 和 Gatsby。我们将从 简介、优缺点、适用场景 以及 实际…

AI数据分析:deepseek生成SQL

在当今数据驱动的时代&#xff0c;数据分析已成为企业和个人决策的重要工具。随着人工智能技术的快速发展&#xff0c;AI 驱动的数据分析工具正在改变我们处理和分析数据的方式。本文将着重介绍如何使用 DeepSeek 进行自动补全SQL 查询语句。 我们都知道&#xff0c;SQL 查询语…

解决:Word 保存文档失败,重启电脑后,Word 在试图打开文件时遇到错误

杀千刀的微软&#xff0c;设计的 Word 是个几把&#xff0c;用 LaTex 写完公式&#xff0c;然后保存&#xff0c;卡的飞起 我看文档卡了很久&#xff0c;就关闭文档&#xff0c;然后 TMD 脑抽了重启电脑 重启之后&#xff0c;文档打不开了&#xff0c;显示 杀千刀的&#xff…

【LeetCode 热题 100】3. 无重复字符的最长子串 | python 【中等】

美美超过管解 题目&#xff1a; 3. 无重复字符的最长子串 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。 注…

weblogic部署报错汇总

weblogic部署报错汇总 Weblogic部署遇到的问题 1.部署完weblogic&#xff0c;进入weblogic控制台&#xff0c;后提示无资源可访问。 解决方法&#xff1a; 权限问题&#xff0c;检查weblogic应用的启动用户和所属用户是否一致。 2. 安装weblogic&#xff0c;创建域的时候特别…

如何在后端服务发布过程中使用蓝绿部署

一、概念 蓝绿部署(Blue-Green Deployment)是一种常用的零停机发布策略,旨在减少发布过程中的风险和系统停机时间。它通过在同一环境中并行维护两个相似的环境(蓝色环境和绿色环境)来实现无缝的应用发布。以下是蓝绿部署策略在后端服务发布中的应用流程以及一些注意事项。…

辛格迪客户案例 | 深圳善康医药科技GMP培训管理(TMS)项目

01 善康医药&#xff1a;创新药领域的探索者 深圳善康医药科技股份有限公司自2017年创立以来&#xff0c;便扎根于创新药研发领域&#xff0c;专注于成瘾治疗药物的研究、生产与销售。公司坐落于深圳&#xff0c;凭借自身独特的技术优势与研发实力&#xff0c;在行业内逐渐崭露…

ArcGIS Pro:轻松制作地震动画,洞察灾害动态

在当今的信息展示领域&#xff0c;动画因其直观、生动的特点&#xff0c;逐渐成为各类汇报、研究展示中的重要元素。 尤其是在地理信息领域&#xff0c;通过动画来展示动态的地理现象&#xff0c;能够让观众更清晰地理解数据背后所蕴含的信息。 地震作为一种突发性的自然灾害…

redis测评

一、身份鉴别 身份标识与鉴别 Redis默认无口令即可登录&#xff0c;需通过配置文件&#xff08;redis.conf&#xff09;设置requirepass参数启用密码认证。密码需满足复杂度要求&#xff08;如长度、字符组合&#xff09;&#xff0c;但Redis自身不支持复杂度策略&#xff0c;需…

单例模式的五种实现方式

1、饿汉式 ①实现&#xff1a;在类加载的时候就初始化实例 ②优点&#xff1a;线程安全 ③缺点&#xff1a;实例在类加载的时候创建&#xff0c;可能会浪费资源 //饿汉式 public class EagerSingleton{private EagerSingleton(){} //私有构造方法private static EagerSingle…

2025-03-04 学习记录--C/C++-C语言 判断是否是素数

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; C语言 判断是否是素数 一、代码 ⭐️ #include <stdio.h> #include <stdbool.h> // 使用 bool 类型// 判断是否是…

MR的环形缓冲区(底层)

MapReduce的大致流程&#xff1a; 1、HDFS读取数据&#xff1b; 2、按照规则进行分片&#xff0c;形成若干个spilt&#xff1b; 3、进行Map 4、打上分区标签&#xff08;patition&#xff09; 5、数据入环形缓冲区&#xff08;KVbuffer&#xff09; 6、原地排序&#xff…

LeetCode hot 100—二叉树的中序遍历

题目 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 示例 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#xff1a;root […

aws(学习笔记第三十一课) aws cdk深入学习(batch-arm64-instance-type)

aws(学习笔记第三十一课) aws cdk深入学习 学习内容&#xff1a; 深入练习aws cdk下部署batch-arm64-instance-type 1. 深入练习aws cdk下部署batch-arm64-instance-type 代码链接 代码链接 代码链接 -> batch-arm64-instance-type之前代码学习 之前学习代码链接 -> aw…

C语言基础之【指针】(下)

C语言基础之【指针】&#xff08;下&#xff09; 指针和字符串字符指针字符指针做函数参数const修饰的指针变量指针数组做为main函数的形参项目开发常用字符串应用模型while和do-while模型两头堵模型字符串反转模型 字符串处理函数strchr()strrchr()strstr()strtok()strcpy()st…

【够用就好006】如何从零开发游戏上架steam面向AI编程的godot独立游戏制作实录001流程

记录工作实践 这是全新的系列&#xff0c;一直有个游戏制作梦 感谢AI时代&#xff0c;让这一切变得可行 长欢迎共同见证&#xff0c;期更新&#xff0c;欢迎保持关注&#xff0c;待到游戏上架那一天&#xff0c;一起玩 面向AI编程的godot独立游戏制作流程实录001 本期是第…

java 重点知识 — JVM存储模块与类加载器

1 jvm主要模块 方法区 存储了由类加载器从.class文件中解析的类的元数据&#xff08;类型信息、域信息、方法信息&#xff09;及运行时常量池&#xff08;引用符号及字面量&#xff09;。 所有线程共享&#xff1b;内存不要求连续&#xff0c;可扩展&#xff0c;可能发生垃圾回…