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 🌟🌟 29. 两数相除 Divide Two Integers 🌟🌟 30. 串联所有单词的子串 Substring-with-concatenation-of-all-words &#x…...
As ccess 数据库与表的操作
1. Access 数据库设计的一般步骤 . 2. 基本概念:Access 数据库、表、记录、字段 . 3. 使用表设计器创建表 (1)字段名命名规则 不能空格开头、不能用.!()[]、最长 64 个字符 (2)字段类型:文本、数字、日期/时…...
自动化的测试工具
1, 自动化功能测试工具:QTP、selenium 2, 自动化性能测试功能:LoadRunner、jmeter 3, 自动化接口测试工具:Charles、soapUI、LoadRunner、jmeter、postman、 测试工具 4, 测试管理工…...

Host头攻击
转载与:https://blog.csdn.net/weixin_47723270/article/details/129472716 01 HOST头部攻击漏洞知识 Host首部字段是HTTP/1.1新增的,旨在告诉服务器,客户端请求的主机名和端口号,主要用来实现虚拟主机技术。 运用虚拟主机技术&a…...
Android 12.0默认开启无障碍服务权限和打开默认apk无障碍服务
1.概述 在12.0的系统rom定制化开发中,在第三方app开发中,需要开启无障碍服务功能,就不需要在代码中开启无障碍服务了, 为了简便就需要在系统中开启无障碍服务,来实现开启无障碍服务功能 2. 默认开启无障碍服务权限和打开默认apk无障碍服务核心代码 frameworks/base/core…...
怎么成为优秀的软件工程师,而不是优秀的码农?
作为软件行业的从业者,每个人都希望最终成为优秀的软件工程师,而不仅仅是码农。一个码农只关注于编写代码和解决问题,而一个软件工程师则涉及到更广泛的职责和技能。 以下是一些要点,可以帮助你脱颖而出,成为一个优秀…...

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

复杂数据集,召回、精度等突破方法记录【以电科院过检识别模型为参考】
目录 一、数据分析与数据集构建 二、所有相关的脚本 三、模型效果 一、数据分析与数据集构建 由于电科院数据集有17w-18w张,标签错误的非常多,且漏标非常多,但是所有有效时间只有半个月左右,显卡是M60,训练速度特别…...
那些你不得不会的提高工作效率的软件神器
那些你不得不会的提高工作效率的软件神器 文本编辑器 vscode 跨平台,插件丰富。 code-server vscode服务器版本,可以在浏览器中开发调试代码,尤其适用于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(Role-Based Access Control)是一种基于角色的访问控制模型,用于管理系统中用户的权限和访问控制。它将用户、角色和权限之间的关系进行了明确的定义,以实现灵活的权限管理和控制。 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是较新的语言,但也有诸多优秀特性及生态库。本文介绍大多数软件工程中常用的功能:依赖注入。首先介绍什么是依赖注入,go实现库wire与其他语言的差异。然后通过简单示例实现依赖注入,简化代码、提升可读性。 依赖注入…...
python入门(4)流程控制语句
1. 条件判断语句 条件控制语句用于根据条件来决定程序的执行路径。在Python中,常见的条件控制语句有以下几种: (1)if语句:用于执行满足条件的代码块。示例代码: age 20 if age > 18:print("成年…...

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

java+springboot留学生新闻资讯网的设计与实现
Spring框架是Java平台的一个开放源代码的Full-stack(全栈)应用程序框架,和控制翻转容器的实现。Spring框架的一些核心功能理论,可以用于所有Java应用,Spring还为Java EE构建的Web应用提供大量的扩展支持。Spring框架没有实现任何的编程模型&a…...
分布式事务与分布式锁区别及概念学习
一、 分布式事务 1.1 背景 传统事务ACID是基于单数据库的本地事务,仅支持单机事务,并不支持跨库事务。但随着微服务架构的普及,业务的分库分表导致一个大型业务系统往往由若干个子系统构成,这些子系统又拥有各自独立的数据库。往往一个业务流程需要由多个子系统共同完成,…...

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

庄懂的TA笔记(十七)<特效:屏幕UV + 屏幕扰动>
庄懂的TA笔记(十七)<特效:屏幕UV 屏幕扰动> 大纲: 目录 庄懂的TA笔记(十七)<特效:屏幕UV 屏幕扰动> 大纲: 正文: 一…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
微服务通信安全:深入解析mTLS的原理与实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言:微服务时代的通信安全挑战 随着云原生和微服务架构的普及,服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...

【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...