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

news2024/11/26 7:26:57

目录

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)暂停更

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

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

相关文章

FL Studio 21最新中文版本发布!原生插件、UI、操作优化全面更新!

FL Studio 21现已推出&#xff0c;提供更快、更精确的音频编辑&#xff0c;升级后的DAW为用户提供了更多的内容发现和改进的界面。 Image-Line发布了FL Studio 21&#xff0c;称其可以实现更快、更精确的音频编辑&#xff0c;以及对整个DAW的更多控制。 期待已久的DAW升级为用…

网络安全的学习路线是怎么样的?

在众多高大上的学习路线指导中&#xff0c;尝试做一股清流&#xff0c;把要讲清楚的都讲清楚&#xff0c;该学些什么&#xff0c;学到哪个程度进入到下一阶段的学习这些才是最重要的。 在学习之前首先要做好学习的系统规划&#xff1a; 1.目前市场需求主流的岗位里&#xff0…

苏州狮山广场能耗管理系统

摘要&#xff1a;随着社会生活水平的提高&#xff0c;经济的繁荣发展&#xff0c;人们对能源的需求逐渐增长&#xff0c;由此带来的能源危机日益严重。商场如何实时的了解、分析和控制商场的能源消耗已成为需要解决的迫在眉睫的难题。传统的能源消耗智能以月/季度/年为周期进行…

springboot+jsp+java高校实验室设备管理系统

本次程序软件的开发的目的就是让使用者可以通过使用该软件提高信息数据的管理效率&#xff0c;同时该程序软件也需要针对不同的操作用户设置对应的功能&#xff0c;因此&#xff0c;此程序的操作流程应该尽量与用户日常操作软件的行为习惯相贴合&#xff0c;另外&#xff0c;程…

国内开源的中文Docker管理工具,界面清爽,赞!

文章目录 一、docker.ui1、简介2、docker.ui安装3、启动效果 一、docker.ui 1、简介 一个用于docker容器和docker集群的可视化管理工具&#xff0c;您可以浏览和维护docker单节点或集群节点worker和Manager。 2、docker.ui安装 安装命令如下&#xff1a; docker run --name…

Selinux 安全上下文与端口控制

Selinux Selinux 的全称是Security Enhance Linux&#xff0c;就是安全加强的Linux。在Selinux之前root账号能够任意的访问所有文档和服务在selinux中&#xff0c;访问控制属性叫做安全上下文&#xff0c;所有客体&#xff08;文件、进程间通讯通道、套接字、网络主机等&#…

创客匠人CEO蒋洪波:抓住抓住市场需求发展

拍手访谈创客匠人CEO蒋洪波&#xff1a;创客匠人是如何开始的&#xff1f;未来又将如何发展&#xff1f; 一、创客匠人知识付费是如何开始的&#xff1f; 1.从爱好出发 我本人喜欢做产品&#xff0c;或者说是喜欢研究产品。 得益于在研发产品上的一些天赋&#xff0c;我们产品…

第五十一天学习记录:C语言进阶:枚举和联合(共用体)

枚举顾名思义就是一一列举。 枚举的优点 我们可以使用#define定义常量&#xff0c;为什么非要使用枚举&#xff1f; 1、增加代码的可读性和可维护性 2、和#define定义的标识符比较枚举有类型检查&#xff0c;更加严谨 3、防止了命名污染&#xff08;封装&#xff09; 4、便于…

【Simulink】示波器图形数据导入Matlab重新绘图(论文)

版本&#xff1a;Matlab2019b 效果 示波器波形图片&#xff1a; 黑色背景&#xff0c;而且坐标轴字体较小&#xff0c;不方便修改&#xff0c;不能直接用在论文上面 对比 Matlab 绘图&#xff1a; 接下来介绍如何设置~ Simulink 设置 选择需要导入的示波器数据 点击 Vi…

termux-x11教程

小粉丝已经求稿两个星期了&#xff0c;不写是不行了。 termux-x11 是Termux的一个图形化项目&#xff0c;官方是这么介绍的。 A Termux add-on app providing Android frontend for Xwayland.安装工具 我们需要在Termux和安卓系统上安装工具以成功的运行程序。 x11-repo&am…

实现图片懒加载的5种方式

目录 1、懒加载介绍 2、实现懒加载技术的方案 3、具体实现代码 1、懒加载介绍 当页面需要展示大量图片时&#xff0c;如果一次性渲染所有图片&#xff0c;会向服务器发出大量请求&#xff0c;导致服务器响应慢&#xff0c;出现页面卡顿或崩溃等问题。采用懒加载技术只预先加…

渗透测试 | 指纹识别

0x00 免责声明 本文仅限于学习讨论与技术知识的分享&#xff0c;不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;本文作者不为此承担任何责任&#xff0c;一旦造成后果请自行承担…

LC-3中断实验

一、实验目的 学会分析和理解给定的编程问题&#xff1b;掌握中断驱动的基本原理&#xff1b;掌握键盘数据寄存器&#xff08;KBDR)及键盘状态寄存器&#xff08;KBSR&#xff09;工作基本原理&#xff1b;掌握输出数据寄存器&#xff08;DDR)及输出状态寄存器&#xff08;DSR…

Splunk安装配置

前言 Splunk 社区 &#xff0c;包括白皮书&#xff0c;各类手册&#xff0c;资源下载&#xff0c;社区问答等 入门&#xff1a;Splunk 入门指南 | Splunk 手册&#xff1a;Splunk Enterprise - Splunk Documentation 资源下载:数据可视化工具Splunk Enterprise免费下载 | S…

chatgpt赋能python:Python对Word文档的支持——打造高效办公新选择

Python对Word文档的支持——打造高效办公新选择 在现代社会&#xff0c;文档处理和管理已成为各行各业不可或缺的一部分。在这个领域中&#xff0c;Word文档一直占据主导地位&#xff0c;成为了几乎所有企业和机构必备的工具。而Python作为一门众所周知的高效编程语言&#xf…

雅思口语话题准备(一)

目录 where are you from&#xff1f; 3.Will you live in the countryside in the future? 4.Have you learned the history of your hometown at school? Does your name have any particular(or special)meaning? 作为一个英语音标大师&#xff0c;请问ɒ和ɔ他们之间有…

chatgpt赋能python:Python%(.2f)怎么用?从入门到进阶

Python%(.2f)怎么用&#xff1f;从入门到进阶 Python作为一种高效的编程语言&#xff0c;拥有广泛的应用领域&#xff0c;尤其在AI、数据分析、Web开发以及自动化运维等方面得到了广泛的应用&#xff0c;成为当下最受欢迎的编程语言之一。在这篇SEO文章中&#xff0c;我们将介…

5月25日第壹简报,星期四,农历四月初七

5月25日第壹简报&#xff0c;星期四&#xff0c;农历四月初七坚持阅读&#xff0c;静待花开1. 教育部&#xff1a;2023年为中西部乡镇卫生院培养订单定向免费五年制本科医学生共计6150人。2. 全球第一个集成人工智能功能的PC系统诞生&#xff01;微软宣布将在6月推出Windows Co…

c++ ffmpeg 浅谈YUV444、YUV422、YUV420(2)

本期将会给大家介绍YUV相关基础知识&#xff0c;同时也介绍威创网络分布式系统的卓越色彩处理技术。 1.什么是YUV色彩空间 2.YUV采样格式 3.YUV不同采样格式对图像画质的影响分析 一、什么是YUV色彩空间? YUV是视频、图片、相机等应用中常常使用的一类图像格式&#xff0c;是…