Rust面试宝典第14题:旋转数组

news2024/11/18 20:22:27

题目

        给定一个数组,将数组中的元素向右移动k个位置,其中k是非负数。要求如下:

        (1)尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。

        (2)使用时间复杂度为O(n)和空间复杂度为O(1)的原地算法解决这个问题。

        示例 1:

输入: [1, 2, 3, 4, 5, 6, 7] 和 k = 3

输出: [5, 6, 7, 1, 2, 3, 4]

解释:

向右旋转1步: [7, 1, 2, 3, 4, 5, 6]

向右旋转2步: [6, 7, 1, 2, 3, 4, 5]

向右旋转3步: [5, 6, 7, 1, 2, 3, 4]

        示例 2:

输入: [-8, -100, 50, 66] 和 k = 2

输出: [50, 66, -8, -100]

解释:

向右旋转1步: [66, -8, -100, 50]

向右旋转2步: [50, 66, -8, -100]

解析

        这道题主要考察应聘者从多个角度、多个维度分析和思考问题的能力。

        最直接、最简单的解决方案当然是“暴力法”,也就是每次将数组向右移动一个元素,一共旋转k次。向右移动一个元素,需要将最后一个元素移动到数组开头,然后将其他元素依次右移。“暴力法”的时间复杂度为O(n*k),空间复杂度为O(1)。具体实现,可参考下面的示例代码。这里,我们使用了Rust标准库中的rotate_right方法,它直接提供了按指定步数向右旋转数组的功能,使得代码更为简洁。

fn rotate_array(arr: &mut [i32], mut k: usize) {
    let n_len = arr.len();
    k %= n_len;
    arr.rotate_right(k);
}

fn print_array(arr: &[i32]) {
    for &item in arr.iter() {
        print!("{} ", item);
    }
    println!();
}

fn main() {
    let mut data = [1, 2, 3, 4, 5, 6, 7];
    rotate_array(&mut data, 3);
    print_array(&data);
}

        “暴力法”的时间复杂度较高,我们可以通过以空间换时间的方式来优化时间复杂度。具体做法为:使用一个额外的数组来将每个元素放到正确的位置上,也就是我们把原本数组里下标为i的元素,放到(i+k)%数组长度的位置;最后,我们把新的数组拷贝到原来的数组中。该方法的时间复杂度为O(n),空间复杂度也为O(n)。具体实现,可参考下面的示例代码。这里,我们使用to_vec()方法来创建原数组的一个拷贝,然后通过索引操作和copy_from_slice()方法来完成数据的转移。

fn rotate_array(arr: &mut [i32], k: usize) {
    let n_len = arr.len();
    let mut data_bak = arr.to_vec();
    for i in 0..n_len {
        data_bak[(i + k) % n_len] = arr[i];
    }
    arr.copy_from_slice(&data_bak);
}

fn print_array(arr: &[i32]) {
    for &item in arr {
        print!("{} ", item);
    }
    println!();
}

fn main() {
    let mut data = vec![1, 2, 3, 4, 5, 6, 7];
    rotate_array(&mut data, 3);
    print_array(&data);
}

        实际上,解决旋转数组的问题还可以通过三次反转数组来实现。第一次整体反转,使原数组后k个元素位于前k个元素中,但内部顺序正好相反。第二次反转,只需要反转前k个元素。第三次反转,只需要反转后n-k个元素。需要注意的是:如果k大于数组的长度,需要对k取模,以保证不会超出数组的范围。

        接下来,我们来看看如何反转数组。反转数组指的是将数组的顺序颠倒,比如:给定数组为[1, 2, 3, 4, 5, 6, 7],则反转后的数组为[7, 6, 5, 4, 3, 2, 1]。可以通过双指针法来实现反转,先交换数组的第一个数和最后一个数,然后交换第二个数和倒数第二个数,一直到数组中间即可。该方法的时间复杂度为O(n),空间复杂度也为O(1)。具体实现,可参考下面的示例代码。这里,我们通过三次反转数组的部分来完成整个数组的旋转。我们还使用了Rust的swap方法来交换数组中的元素,并且利用了数组的可变引用&mut [i32]来直接修改原数组内容。

fn reverse_array(arr: &mut [i32], mut start: usize, mut end: usize) {
    while start < end {
        arr.swap(start, end);
        start += 1;
        end -= 1;
    }
}

fn rotate_array(arr: &mut [i32], k: usize) {
    let n_len = arr.len();
    let actual_k = k % n_len;
    reverse_array(arr, 0, n_len - 1);
    reverse_array(arr, 0, actual_k - 1);
    reverse_array(arr, actual_k, n_len - 1);
}

fn print_array(arr: &[i32]) {
    for &item in arr {
        print!("{} ", item);
    }
    println!();
}

fn main() {
    let mut data = [1, 2, 3, 4, 5, 6, 7];
    rotate_array(&mut data, 3);
    print_array(&data);
}

总结

        一个问题的解决方案可能远不止一种,正所谓“条条大路通罗马”,如何在众多解决方案中找出最优解,实际上非常考验软件开发工程师的综合能力。从多个角度、多个维度分析和思考问题,是一种非常有效的思维方式,可以帮助我们更全面地理解问题,并找到更好更优的解决方案。

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

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

相关文章

微服务远程调用 RestTemplate

Spring给我们提供了一个RestTemplate的API&#xff0c;可以方便的实现Http请求的发送。 同步客户端执行HTTP请求&#xff0c;在底层HTTP客户端库(如JDK HttpURLConnection、Apache HttpComponents等)上公开一个简单的模板方法API。RestTemplate通过HTTP方法为常见场景提供了模…

VisualStudio2022的使用

Visual Studio 2022 的安装、卸载和使用方法详解 一、安装Visual Studio 2022 1. 下载Visual Studio 2022 要安装Visual Studio 2022&#xff0c;需要先下载安装程序。可以从微软的官方网站&#xff08;Visual Studio下载页面&#xff09;下载免费的社区版&#xff08;Commun…

非平稳信号的傅里叶变换与短时傅里叶变换

一、仿真一个非平稳的时间序列。 N 10000; t 0:N-1; z1 4.2*sin(2*pi/20.*t5); z2 2.2*sin(2*pi/100.*(10.001*t).*t8); w1 randn(length(t),1); yz1z2w1; figure;plot(y,LineWidth,1.5);grid on; ylabel(Signal); xlabel(Time); 二、傅里叶变换&#xff08;FFT&#xff…

网创教程:WordPress插件网创自动采集并发布

网创教程&#xff1a;WordPress插件网创自动采集并发布 使用插件注意事项&#xff1a; 如果遇到404错误&#xff0c;请先检查并调整网站的伪静态设置&#xff0c;这是最常见的问题。需要定制化服务&#xff0c;请随时联系我。 本次更新内容 我们进行了多项更新和优化&#x…

保护共享资源的方法(互斥锁)

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

一个基于vue、nuxt.js的网盘搜索项目,且持续开源和维护;目的实现人人都可以拥有自己的网盘搜索网站;

一个基于vue、nuxt.js的网盘搜索项目&#xff0c;且持续开源和维护&#xff1b;目的实现人人都可以拥有自己的网盘搜索网站&#xff1b; &#x1f310;Github地址 https://github.com/unilei/aipan-netdisk-search &#x1f310;在线体验 https://so.aicompasspro.com/

我在去哪儿薅到了5块钱火车票代金券,速薅

哈哈&#xff0c;亲爱的薅羊毛小伙伴们&#xff01; 刚刚在去哪儿大佬那儿发现了一个超级薅羊毛福利&#xff01;我只花了短短两分钟&#xff0c;就搞到了一张5块钱火车票代金券&#xff0c;简直是天上掉馅饼的节奏啊&#xff01; 话不多说&#xff0c;薅羊毛的姿势给你们摆好…

202473读书笔记|《但愿呼我的名为旅人:松尾芭蕉俳句300》——围炉夜话,身顿心安,愿每个人都能在爱里自由驰骋

202473读书笔记|《但愿呼我的名为旅人&#xff1a;松尾芭蕉俳句300》——围炉夜话&#xff0c;身顿心安&#xff0c;愿每个人都能在爱里自由驰骋 &#x1f60d;&#x1f60d;&#x1f929;&#x1f929; 译者序正文二正文三正文四正文五正文六正文七 《但愿呼我的名为旅人&…

【动手学强化学习】第 6 章 Dyna-Q 算法知识点总结

【动手学强化学习】第 6 章 Dyna-Q 算法知识点总结 本章知识点基于模型的强化学习与无模型的强化学习方法简介无模型的强化学习方法基于模型的强化学习方法 强化学习算法的评价指标Dyna-Q算法Dyna-Q 算法的具体流程Dyna-Q 代码实践 本章知识点 基于模型的强化学习与无模型的强…

前端 CSS 经典:好看的标题动画

前言&#xff1a;好看的标题动画实现。 效果&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><…

syncthing文件夹同步与版本管理

1 前言 syncthing可以用来同步文件夹里的所有文件&#xff0c;并且有不错的版本管理&#xff0c;基本每次更改文件&#xff0c;20-40秒就被扫描到了&#xff0c;非常丝滑&#xff1b;这次以此来同步obsidian的插件和文件&#xff0c;达到多端同步&#xff1b; 我家里有一台台…

自定义横向思维导图,横向组织架构图,横向树图。可以自定义节点颜色,样式,还可以导出为图片

最近公司设计要求根据目录结构&#xff0c;横向展示。所以做了一个横向的思维导图&#xff0c;横向的树结构&#xff0c;横向的组织架构图&#xff0c;可以自定义节点颜色&#xff0c;样式&#xff0c;还可以导出为图片 话不多说&#xff0c;直接上图片&#xff0c;这个就是一…

Django自定义命令

Django自定义命令 我们知道&#xff0c;Django内部内置了很多命令&#xff0c;例如 python manage.py runserver python manage.py makemigrations python manage.py migrate我们可以在python控制台中查看所有命令 我们也可以自定义命令&#xff0c;让python manage.py执行…

如何使用甘特图来做任务管理?zz-plan甘特图的实践指南

在项目管理和任务调度中&#xff0c;甘特图是一种非常实用的工具&#xff0c;它可以帮助团队成员清晰地规划、执行和跟踪项目进度。然而&#xff0c;如何有效利用甘特图进行任务管理&#xff0c;对于许多团队来说仍然是一个挑战。本文将结合 zz-plan https://zz-plan.com/ 甘特…

彻底搞懂JavaScript原型和原型链

基于原型编程 在面向对象的编程语言中&#xff0c;类和对象的关系是铸模和铸件的关系&#xff0c;对象总是从类创建而来&#xff0c;比如Java中&#xff0c;必须先创建类再基于类实例化对象。 而在基于原型编程的思想中&#xff0c;类并不是必须的&#xff0c;对象都是通过克隆…

Unity数据持久化2——XML

简介&#xff1a; 基础知识 XML文件格式 XML基本语法 XML属性 练习&#xff1a; C#读取存储XML XML文件存放位置 读取XML文件 练习&#xff1a; 存储修改XML文件 练习&#xff1a; 总结 实践小项目 必备知识点 必备知识点——C#中XML序列化 必备知识点——C#中XML反序列化 必备…

ubuntu设置root开机登录,允许root用户ssh远程登录

ubuntu与centos系统不同&#xff0c;默认root开机不能登录。 1、输入一下命令创建root密码&#xff0c;根据提示输入新密码 sudo passwd root 2、打开gdm-autologin文件&#xff0c;将auth required pam_succeed_if.so user ! root quiet_success这行注释掉&#xff0c;这行就…

【python】python社交交友平台系统设计与实现(源码+数据库)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

python安装路径可以更改吗

Python3.5默认安装路径是当前用户的 AppData\.. 下 现在安装过程中默认是install just for me&#xff0c;这个会把python默认安装到AppData文件夹中&#xff0c;如果选了install for all users&#xff0c;就会默认安装到C盘根目录了。 python3.5 安装&#xff1a; 输入官网…

机器学习入门-sklearn

概述 机器学习定义是什么&#xff1f; 官方定义&#xff1a; 机器学习是人工智能核心&#xff0c;是使计算机具有智能的根本途径。&#xff08;地位&#xff09; 机器学习专门研究计算机怎样模拟或实现人类的学习行为&#xff08;研究内容&#xff09;&#xff0c;以获取新的…