当前位置: 首页 > news >正文

Rust每日一练(Leetday0010) 子串下标、两数相除、串联子串

目录

28. 找出字符串中第一个匹配项的下标 Find-the-index-of-the-first-occurrence-in-a-string  🌟🌟

29. 两数相除 Divide Two Integers  🌟🌟

30. 串联所有单词的子串 Substring-with-concatenation-of-all-words  🌟🌟🌟

🌟 每日一练刷题专栏 🌟

Rust每日一练 专栏

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


28. 找出字符串中第一个匹配项的下标 Find-the-index-of-the-first-occurrence-in-a-string

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回  -1 

说明:实现 ​strStr()​ 函数。对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 ​strStr()​ 以及 Java 的​ indexOf()​ 定义相符。

当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。

示例 1:

输入:haystack = "hello", needle = "ll"
输出:2

示例 2:

输入:haystack = "aaaaa", needle = "bba"
输出:-1

提示:

  • 1 <= haystack.length, needle.length <= 10^4
  • haystack 和 needle 仅由小写英文字符组成

代码1:

fn str_str(haystack: String, needle: String) -> i32 {let n = haystack.len();let m = needle.len();if m == 0 {return 0;}if n < m {return -1;}for i in 0..=n-m {if haystack[i..i+m] == needle {return i as i32;}}return -1;
}fn main() {let haystack = "hello".to_string();let needle = "ll".to_string();println!("{}", str_str(haystack, needle));let haystack = "aaaaa".to_string();let needle = "bba".to_string();println!("{}", str_str(haystack, needle));
}

输出:

2
-1

代码2:

fn str_str(haystack: String, needle: String) -> i32 {let mut i = 0_usize;loop {let mut j = 0_usize;loop {if j == needle.len() {return i as i32;}if i + j == haystack.len() {return -1;}if needle.as_bytes()[j] != haystack.as_bytes()[i+j] {break;}j += 1;}i += 1;}
}fn main() {let haystack = "hello".to_string();let needle = "ll".to_string();println!("{}", str_str(haystack, needle));let haystack = "aaaaa".to_string();let needle = "bba".to_string();println!("{}", str_str(haystack, needle));
}

另: Rust语言有现成的字符串方法 haystack.find(&needle)

fn main() {let haystack = "hello".to_string();let needle = "ll".to_string();println!("{:?}", haystack.find(&needle));let haystack = "aaaaa".to_string();let needle = "bba".to_string();println!("{:?}", haystack.find(&needle));
}

29. 两数相除 Divide Two Integers

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

返回被除数 dividend 除以除数 divisor 得到的商。

整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2

示例 1:

输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = truncate(3.33333..) = truncate(3) = 3

示例 2:

输入: dividend = 7, divisor = -3
输出: -2
解释: 7/-3 = truncate(-2.33333..) = -2

提示:

  • 被除数和除数均为 32 位有符号整数。
  • 除数不为 0。
  • 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2^31,  2^31 − 1]。本题中,如果除法结果溢出,则返回 2^31 − 1。

代码:

pub fn divide(dividend: i32, divisor: i32) -> i32 {// 处理特殊情况if dividend == std::i32::MIN && divisor == -1 {return std::i32::MAX;}if divisor == 1 {return dividend;}if divisor == -1 {return -dividend;}// 处理符号let mut res = 0;let mut sign = 1;if (dividend > 0 && divisor < 0) || (dividend < 0 && divisor > 0) {sign = -1;}let mut a = abs(dividend);let b = abs(divisor);// 计算商while a >= b {let (mut temp, mut tb) = (1, b);while a >= (tb << 1) {tb <<= 1;temp <<= 1;}res += temp;a -= tb;}res * sign
}fn abs(x: i32) -> i32 {if x < 0 {-x} else {x}
}fn main() {println!("{}", divide(10, 3));println!("{}", divide(7, -3));
}

输出:

3
-2


30. 串联所有单词的子串 Substring-with-concatenation-of-all-words

给定一个字符串 s 和一些 长度相同 的单词 words 。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。

注意子串要与 words 中的单词完全匹配,中间不能有其他字符 ,但不需要考虑 words 中单词串联的顺序。

示例 1:

输入:s = "barfoothefoobarman", words = ["foo","bar"]
输出:[0,9]解释:
从索引 0 和 9 开始的子串分别是 "barfoo" 和 "foobar" 。
输出的顺序不重要, [9,0] 也是有效答案。

示例 2:

输入:s = "wordgoodgoodgoodbestword", words = ["word","good","best","word"]
输出:[]

示例 3:

输入:s = "barfoofoobarthefoobarman", words = ["bar","foo","the"]
输出:[6,9,12]

提示:

  • 1 <= s.length <= 10^4
  • s 由小写英文字母组成
  • 1 <= words.length <= 5000
  • 1 <= words[i].length <= 30
  • words[i] 由小写英文字母组成

代码1:  暴力枚举

pub fn find_substring(s: String, words: Vec<String>) -> Vec<i32> {let n = s.len();let m = words.len();if n == 0 || m == 0 {return Vec::new();}let word_len = words[0].len();let mut ans = Vec::new();for i in 0..=n - m * word_len {let mut j = 0;let mut used = vec![false; m];while j < m {let word = &s[i + j * word_len..i + j * word_len + word_len];let mut k = 0;while k < m {if !used[k] && word == &words[k] {used[k] = true;break;}k += 1;}if k == m {break;}j += 1;}if j == m {ans.push(i as i32);}}ans
}fn main() {let s = String::from("barfoothefoobarman");let words = vec![String::from("foo"), String::from("bar")];println!("{:?}", find_substring(s, words));let s = String::from("wordgoodgoodgoodbestword");let words = vec![String::from("word"),String::from("good"),String::from("best"),String::from("word"),];println!("{:?}", find_substring(s, words));let s = String::from("barfoofoobarthefoobarman");let words = vec![String::from("bar"), String::from("foo"), String::from("the")];println!("{:?}", find_substring(s, words));
}

输出:

[0, 9]
[]
[6, 9, 12]

代码2: 滑动窗口

use std::collections::HashMap;pub fn find_substring(s: String, words: Vec<String>) -> Vec<i32> {let n = s.len();let m = words.len();if n == 0 || m == 0 {return vec![];}let word_len = words[0].len();let mut cnt = HashMap::new();for word in words {*cnt.entry(word).or_insert(0) += 1;}let mut ans = Vec::new();for i in 0..word_len {let mut left = i;let mut right = i;let mut window = HashMap::new();while right + word_len <= n {let word = &s[right..right + word_len];right += word_len;if *cnt.get(word).unwrap_or(&0) == 0 {left = right;window.clear();} else {*window.entry(word.to_string()).or_insert(0) += 1;while *window.get(word).unwrap_or(&0) > *cnt.get(word).unwrap_or(&0) {let d_word = &s[left..left + word_len];left += word_len;*window.entry(d_word.to_string()).or_insert(0) -= 1;}if right - left == word_len * m {ans.push(left as i32);}}}}ans
}fn main() {let s = String::from("barfoothefoobarman");let words = vec![String::from("foo"), String::from("bar")];println!("{:?}", find_substring(s, words));let s = String::from("wordgoodgoodgoodbestword");let words = vec![String::from("word"),String::from("good"),String::from("best"),String::from("word"),];println!("{:?}", find_substring(s, words));let s = String::from("barfoofoobarthefoobarman");let words = vec![String::from("bar"), String::from("foo"), String::from("the")];println!("{:?}", find_substring(s, words));
}

代码3:滑动窗口

use std::collections::HashMap;pub fn find_substring(s: String, words: Vec<String>) -> Vec<i32> {let n = s.len();let m = words.len();if n == 0 || m == 0 {return vec![];}let word_len = words[0].len();let mut cnt = HashMap::new();for word in &words {*cnt.entry(word.to_string()).or_insert(0) += 1;}let mut ans = Vec::new();for i in 0..word_len {let mut left = i;let mut right = i;let mut window = HashMap::new();let mut count = 0;while right + word_len <= n {let word = &s[right..right + word_len];right += word_len;if cnt.get(word).cloned().unwrap_or(0) == 0 {left = right;window.clear();count = 0;} else {*window.entry(word.to_string()).or_insert(0) += 1;count += 1;while window.get(word).cloned().unwrap_or(0) > cnt.get(word).cloned().unwrap_or(0) {let d_word = &s[left..left + word_len];left += word_len;*window.entry(d_word.to_string()).or_insert(0) -= 1;count -= 1;}if count == m {ans.push(left as i32);}}}}ans
}fn main() {let s = String::from("barfoothefoobarman");let words = vec![String::from("foo"), String::from("bar")];println!("{:?}", find_substring(s, words));let s = String::from("wordgoodgoodgoodbestword");let words = vec![String::from("word"),String::from("good"),String::from("best"),String::from("word"),];println!("{:?}", find_substring(s, words));let s = String::from("barfoofoobarthefoobarman");let words = vec![String::from("bar"), String::from("foo"), String::from("the")];println!("{:?}", find_substring(s, words));
}

代码4: 滑动窗口

use std::collections::HashMap;pub fn find_substring(s: String, words: Vec<String>) -> Vec<i32> {let n = s.len();let m = words.len();if n == 0 || m == 0 {return vec![];}let word_len = words[0].len();let mut cnt = HashMap::new();for word in &words {*cnt.entry(word.to_string()).or_insert(0) += 1;}let mut ans = Vec::new();for i in 0..word_len {let mut left = i;let mut right = i;let mut window = HashMap::new();let mut count = 0;while right + word_len <= n {let word = &s[right..right + word_len];right += word_len;if cnt.get(word).cloned().unwrap_or(0) == 0 {left = right;window.clear();count = 0;} else {*window.entry(word.to_string()).or_insert(0) += 1;count += 1;while window.get(word).cloned().unwrap_or(0) > cnt.get(word).cloned().unwrap_or(0) {let d_word = &s[left..left + word_len];left += word_len;*window.entry(d_word.to_string()).or_insert(0) -= 1;count -= 1;}if count == m {ans.push(left as i32);}}if right - left == word_len * (m + 1) {let d_word = &s[left..left + word_len];left += word_len;*window.entry(d_word.to_string()).or_insert(0) -= 1;count -= 1;}}}ans
}fn main() {let s = String::from("barfoothefoobarman");let words = vec![String::from("foo"), String::from("bar")];println!("{:?}", find_substring(s, words));let s = String::from("wordgoodgoodgoodbestword");let words = vec![String::from("word"),String::from("good"),String::from("best"),String::from("word"),];println!("{:?}", find_substring(s, words));let s = String::from("barfoofoobarthefoobarman");let words = vec![String::from("bar"), String::from("foo"), String::from("the")];println!("{:?}", find_substring(s, words));
}

🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/

Rust每日一练 专栏

(2023.5.16~)更新中...

Golang每日一练 专栏

(2023.3.11~)更新中...

Python每日一练 专栏

(2023.2.18~2023.5.18)暂停更

C/C++每日一练 专栏

(2023.2.18~2023.5.18)暂停更

Java每日一练 专栏

(2023.3.11~2023.5.18)暂停更

相关文章:

Rust每日一练(Leetday0010) 子串下标、两数相除、串联子串

目录 28. 找出字符串中第一个匹配项的下标 Find-the-index-of-the-first-occurrence-in-a-string &#x1f31f;&#x1f31f; 29. 两数相除 Divide Two Integers &#x1f31f;&#x1f31f; 30. 串联所有单词的子串 Substring-with-concatenation-of-all-words &#x…...

As ccess 数据库与表的操作

1. Access 数据库设计的一般步骤 . 2. 基本概念&#xff1a;Access 数据库、表、记录、字段 . 3. 使用表设计器创建表 &#xff08;1&#xff09;字段名命名规则 不能空格开头、不能用.!()[]、最长 64 个字符 &#xff08;2&#xff09;字段类型&#xff1a;文本、数字、日期/时…...

自动化的测试工具

1&#xff0c; 自动化功能测试工具&#xff1a;QTP、selenium 2&#xff0c; 自动化性能测试功能&#xff1a;LoadRunner、jmeter 3&#xff0c; 自动化接口测试工具&#xff1a;Charles、soapUI、LoadRunner、jmeter、postman、 测试工具 4&#xff0c; 测试管理工…...

Host头攻击

转载与&#xff1a;https://blog.csdn.net/weixin_47723270/article/details/129472716 01 HOST头部攻击漏洞知识 Host首部字段是HTTP/1.1新增的&#xff0c;旨在告诉服务器&#xff0c;客户端请求的主机名和端口号&#xff0c;主要用来实现虚拟主机技术。 运用虚拟主机技术&a…...

Android 12.0默认开启无障碍服务权限和打开默认apk无障碍服务

1.概述 在12.0的系统rom定制化开发中,在第三方app开发中,需要开启无障碍服务功能,就不需要在代码中开启无障碍服务了, 为了简便就需要在系统中开启无障碍服务,来实现开启无障碍服务功能 2. 默认开启无障碍服务权限和打开默认apk无障碍服务核心代码 frameworks/base/core…...

怎么成为优秀的软件工程师,而不是优秀的码农?

作为软件行业的从业者&#xff0c;每个人都希望最终成为优秀的软件工程师&#xff0c;而不仅仅是码农。一个码农只关注于编写代码和解决问题&#xff0c;而一个软件工程师则涉及到更广泛的职责和技能。 以下是一些要点&#xff0c;可以帮助你脱颖而出&#xff0c;成为一个优秀…...

安装ElasticSearch之前的准备工作jdk的安装

一.windows 下载jdk的软件 (1).进入jdk1.8官网 (2).根据电脑是32位还是64位按需下载 (3).点击下载之后就会跳转到Oracle账号登录界面 没有 Oracle账号的注册一下就可以了 下载好的jdk如下: 双击下一步下一步安装jdk 默认安装就可以了 配置环境变量 (1).电脑左下方设置选项 (2).…...

复杂数据集,召回、精度等突破方法记录【以电科院过检识别模型为参考】

目录 一、数据分析与数据集构建 二、所有相关的脚本 三、模型效果 一、数据分析与数据集构建 由于电科院数据集有17w-18w张&#xff0c;标签错误的非常多&#xff0c;且漏标非常多&#xff0c;但是所有有效时间只有半个月左右&#xff0c;显卡是M60&#xff0c;训练速度特别…...

那些你不得不会的提高工作效率的软件神器

那些你不得不会的提高工作效率的软件神器 文本编辑器 vscode 跨平台&#xff0c;插件丰富。 code-server vscode服务器版本&#xff0c;可以在浏览器中开发调试代码&#xff0c;尤其适用于windows端开发linux服务器程序。 vim linux/unix/mac终端最强大的文本编辑器。 note…...

【VMware】Ubunt 20.04时间设置

文章目录 设置本地时间 UTC8设置24小时制同步网络时间参考 Talk is cheap, show me the code. 设置本地时间 UTC8 查看当前时区状态 rootnode1:~/k8s# timedatectlLocal time: Sun 2023-05-21 15:24:02 CSTUniversal time: Sun 2023-05-21 07:24:02 UTCRTC time: Sun 2023-05-2…...

单点登录三:添加RBAC权限校验模型功能理解及实现demo

1、RBAC权限模型 RBAC&#xff08;Role-Based Access Control&#xff09;是一种基于角色的访问控制模型&#xff0c;用于管理系统中用户的权限和访问控制。它将用户、角色和权限之间的关系进行了明确的定义&#xff0c;以实现灵活的权限管理和控制。 1.1、RBAC模型主要包括以…...

基于用户认证数据构建评估模型预测认证行为风险系统(附源码)

文件说明 datasets // 数据集(训练集、测试集) feature engineering // 特征工程 models // 评估模型 测试环境 Python3.8 任务描述 项目来自系统认证风险预测https://www.datafountain.cn/competitions/537 项目完整源码下载:https://download.csdn.net/download/liu…...

本地训练中文LLaMA模型实战教程,民间羊驼模型,24G显存盘它!

羊驼实战系列索引 博文1:本地部署中文LLaMA模型实战教程,民间羊驼模型 博文2:本地训练中文LLaMA模型实战教程,民间羊驼模型(本博客) 博文3:精调训练中文LLaMA模型实战教程,民间羊驼模型(马上发布) 简介 在学习完上篇【1本地部署中文LLaMA模型实战教程,民间羊驼模…...

快速学Go依赖注入工具wire

Go相对java和C是较新的语言&#xff0c;但也有诸多优秀特性及生态库。本文介绍大多数软件工程中常用的功能&#xff1a;依赖注入。首先介绍什么是依赖注入&#xff0c;go实现库wire与其他语言的差异。然后通过简单示例实现依赖注入&#xff0c;简化代码、提升可读性。 依赖注入…...

python入门(4)流程控制语句

1. 条件判断语句 条件控制语句用于根据条件来决定程序的执行路径。在Python中&#xff0c;常见的条件控制语句有以下几种&#xff1a; &#xff08;1&#xff09;if语句&#xff1a;用于执行满足条件的代码块。示例代码&#xff1a; age 20 if age > 18:print("成年…...

【进阶】C 语言表驱动法编程原理与实践

数据压倒一切。如果选择了正确的数据结构并把一切组织的井井有条&#xff0c;正确的算法就不言自明。编程的核心是数据结构&#xff0c;而不是算法。——Rob Pike 目录 说明 概念提出 查表方式 直接查找 索引查找 分段查找 实战示例 字符统计 月天校验 名称构造 值名…...

java+springboot留学生新闻资讯网的设计与实现

Spring框架是Java平台的一个开放源代码的Full-stack(全栈)应用程序框架&#xff0c;和控制翻转容器的实现。Spring框架的一些核心功能理论&#xff0c;可以用于所有Java应用&#xff0c;Spring还为Java EE构建的Web应用提供大量的扩展支持。Spring框架没有实现任何的编程模型&a…...

分布式事务与分布式锁区别及概念学习

一、 分布式事务 1.1 背景 传统事务ACID是基于单数据库的本地事务,仅支持单机事务,并不支持跨库事务。但随着微服务架构的普及,业务的分库分表导致一个大型业务系统往往由若干个子系统构成,这些子系统又拥有各自独立的数据库。往往一个业务流程需要由多个子系统共同完成,…...

windows先的conda环境复制到linux环境

如果是迁移的环境一致&#xff1a;同是windows或同是linux直接用这个命令即可&#xff1a; conda create -n new_env_name --clone old_env_path 如果是window的环境迁移到linux这种跨环境就不能用上面的方法&#xff0c;网上这方面的资料也很多&#xff0c;记录一下我的…...

庄懂的TA笔记(十七)<特效:屏幕UV + 屏幕扰动>

庄懂的TA笔记&#xff08;十七&#xff09;&#xff1c;特效&#xff1a;屏幕UV 屏幕扰动&#xff1e; 大纲&#xff1a; 目录 庄懂的TA笔记&#xff08;十七&#xff09;&#xff1c;特效&#xff1a;屏幕UV 屏幕扰动&#xff1e; 大纲&#xff1a; 正文&#xff1a; 一…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...