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

题目

        给定一个数组,将数组中的元素向右移动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.mzph.cn/pingmian/13608.shtml

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

相关文章

RAW转换和图像编辑工具:Capture One 23 Pro (win/mac)中文专业版

Capture One 23是一款功能强大的桌面版照片编辑软件&#xff0c;由丹麦PHASE ONE飞思数码公司开发。 以下是该软件的一些主要特点&#xff1a; 强大的RAW处理功能&#xff1a;Capture One 23支持多种品牌的相机和镜头&#xff0c;提供了丰富的RAW处理工具&#xff0c;包括曝光、…

安装ollama并部署大模型并测试

Ollama介绍 项目地址&#xff1a;ollama 官网地址&#xff1a; https://ollama.com 模型仓库&#xff1a;https://ollama.com/library API接口&#xff1a;api接口 Ollama 是一个基于 Go 语言开发的简单易用的本地大语言模型运行框架。可以将其类比为 docker&#xff08;同基…

【vue-3】动态属性绑定v-bind

1、文本动态绑定&#xff1a; <input type"text" v-bind:value"web.url"> 简写&#xff1a; <input type"text" :value"web.url"> 2、文字样式动态绑定 <b :class"{textColor:web.fontStatus}">vue学…

word页眉线如何置于文字上方

然后 敲黑板&#xff0c;点这里

【Java超详细的学习笔记】Java超详细的学习笔记,适合小白入门,Java语法学习,Java开发学习笔记,Java入门学习笔记

一&#xff0c;Java初学者学习笔记 Java超详细的学习笔记&#xff0c;点击我获取 1&#xff0c;Java基础语法 一个 Java 程序可以认为是一系列对象的集合&#xff0c;而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。 对象&#…

碳课堂|ISO 14067 产品碳足迹国际标准

为规范评估产品碳排放&#xff0c;国际标准化组织发布了《ISO14067&#xff1a;2018温室气体-产品碳足迹-量化要求及指南》&#xff0c;标准量化产品生命周期阶段&#xff08;包括从资源开采、原材料采购到产品的生产、使用和报废阶段&#xff09;的温室气体排放的通用标准。该…

功耗相关总结

文章目录 功耗相关的使用场景MCU中低功耗的应用RTOS中低功耗应用 功耗相关的使用场景 目前越来越多的嵌入式设备采用电池进行供电&#xff0c;而不是跟台式电脑一样&#xff0c;可以一直连接着电源。在电池供电的场景下&#xff0c;对功耗的要求很高&#xff0c;工程师们尽量希…

炫酷gdb

在VS里面调试很方便对吧&#xff1f;&#xff08;F5直接调试&#xff0c;F10逐过程调试--不进函数&#xff0c;F11逐语句调试--进函数&#xff0c;F9创建断点&#xff09;&#xff0c;那在Linux中怎么调试呢&#xff1f; 我们需要用到一个工具&#xff1a;gdb 我们知道VS中程…

从业务角度来看,DevOps 是什么?

如果您在我们的应用程序名称中看到“DevOps”&#xff0c;这意味着我们必须正确解释该术语&#xff0c;我们会这样做&#xff0c;但角度会有所不同。让我们从业务角度看看 DevOps 是什么。 通用名称 首先你应该知道&#xff0c;DevOps 没有明确的定义。是的。 大多数情况下&a…

安卓实现5个底部导航栏切换fragment

步骤&#xff0c;写 5 个 fragment 自定义的类5个布局文件&#xff1a; package com.xmkjsoft.xhgh.fragment;import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup;import androidx.annotation.NonNul…

win11安装docker运行Open-Webui 界面化展示 ollama大模型

1.OpenWeb UI运行需要docker 环境下载docker Get Started | Docker 2.需要命令提示符docker -v 查询是否安装成功&#xff1b; 查询docker详情docker version 3.github拉取open-webUi镜像Package open-webui GitHub 复制命令运行在命令提示符&#xff1b; 等待下载完成 4.到…

Web安全:企业如何抵御常见的网络攻击?

近年来随着人类社会向数字世界的加速发展&#xff0c;勒索软件攻击事件在全球范围内呈现快速上升的态势&#xff0c;几乎所有国家的政府、金融、教育、医疗、制造、交通、能源等行业均受到影响&#xff0c;可以说有互联网的地方就可能发生勒索软件攻击事件。 Web安全是一个大课…

【全开源】简单商城系统(PC/UniAPP)

轻松构建您的在线商店 在当今数字化时代&#xff0c;拥有一个在线商店对于许多商家来说已成为必不可少的营销手段。为了满足这一需求&#xff0c;我们推出了“简单商城系统源码”&#xff0c;让您轻松构建并管理您的在线商店。 一、简单易用&#xff0c;快速上手 “简单商城…

C++第三方库【JSON】— jsoncpp

目录 认识JSON jsoncpp库 安装&使用 认识jsoncpp Json::Value jsoncpp序列化 jsoncpp反序列化 认识JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据&#xff0c;常用于在客户端和服…

《QT实用小工具·六十五》基于QPropertyAnimation实现的移动动画和控件覆盖

1、概述 源码放在文章末尾 该项目基于QPropertyAnimation实现了控件平移动画和控件之间的相互覆盖效果&#xff0c;项目demo演示如下所示&#xff1a; 项目解析&#xff1a; new QPropertyAnimation(ui.SingleOcclusion, “pos”); //创建动画对象&#xff0c;第一个参数传…

《Python编程从入门到实践》day37

# 昨日知识点回顾 制定规范、创建虚拟环境并激活&#xff0c;正在虚拟环境创建项目、数据库和应用程序 # 今日知识点学习 18.2.4 定义模型Entry # models.py from django.db import models# Create your models here. class Topic(models.Model):"""用户学习的…

时光初创知识付费模板 3.6.4 安装包 附教程

源码地址&#xff1a; https://wwv.lanzouh.com/b080wj8eh

码蹄集部分题目(2024OJ赛15期;前缀和+栈+堆+队列)

1&#x1f40b;&#x1f40b;&#x1f40b;门票&#xff08;钻石&#xff1b;前缀和&#xff09; 时间限制&#xff1a;1秒 占用内存&#xff1a;128M &#x1f41f;题目描述 &#x1f41f;输入输出格式 &#x1f41f;样例 &#x1f41a;样例 &#x1f41a;备注 &#x1f4…

docker和containerd的区别

docker和containerd的区别 1、容器运行时 1.1 容器运行时概念 容器运行时&#xff08;Container Runtime&#xff09;是一种负责在操作系统层面创建和管理容器的软件工具或组件。它是容器化技术的核心组件之一&#xff0c;用于在容器内部运行应用程序&#xff0c;并提供隔离…

ORACLE 资源管理参数与等待事件resmgr:cpu quantum

RESOURCE_MANAGER_PLAN 先来看下参数的含义 官网链接&#xff1a;RESOURCE_MANAGER_PLAN (oracle.com) 意思翻译过来这个参数用于资源计划。后边的看完也不是很明白具体的作用 于是参考了以下文章 Oracle 参数 RESOURCE_MANAGER_PLAN 官方解释&#xff0c;作用&#xff0c;…