面試經典算法系列之數組/字符串6 -- 輪轉數組

面試經典算法題38-輪轉數組

LeetCode.189
公眾號:阿Q技術站

問題描述

給定一個整數數組 nums,將數組中的元素向右輪轉 k 個位置,其中 k 是非負數。

示例 1:

輸入: nums = [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:

輸入:nums = [-1,-100,3,99], k = 2
輸出:[3,99,-1,-100]
解釋: 
向右輪轉 1 步: [99,-1,-100,3]
向右輪轉 2 步: [3,99,-1,-100]

提示:

  • 1 <= nums.length <= 105
  • -231 <= nums[i] <= 231 - 1
  • 0 <= k <= 105

思路

  1. 處理 k 大于數組長度的情況,因為旋轉一個長度為 n 的數組 n 次,得到的結果和原數組相同。

  2. 可以通過三次翻轉實現數組的旋轉。首先,將整個數組翻轉;然后,將前 k 個元素翻轉;最后,將剩余的元素翻轉。

圖解

        +-----------------------------------------+|               開始執行程序               |+-----------------------------------------+|v+-----------------------------------------+|     輸入: nums = [1,2,3,4,5,6,7], k = 3  |+-----------------------------------------+|v+-----------------------------------------+|        處理 k 大于數組長度的情況            ||        k %= 7,得到 k = 3                |+-----------------------------------------+|v+-----------------------------------------+|        定義反轉數組的函數 reverse()        |+-----------------------------------------+|v+-----------------------------------------+|        定義反轉部分數組的函數               || reverse(nums.begin(), nums.begin() + k) |+-----------------------------------------+|v+-----------------------------------------+|          定義反轉剩余部分數組的函數         ||   reverse(nums.begin() + k, nums.end()) |+-----------------------------------------+|v+-----------------------------------------+|             打印當前數組狀態               ||            [1,2,3,4,5,6,7]              |+-----------------------------------------+|v+-----------------------------------------+|        調用 reverse() 反轉整個數組         ||            [7,6,5,4,3,2,1]              |+-----------------------------------------+|v+-----------------------------------------+|              打印當前數組狀態              ||              [7,6,5,4,3,2,1]            |+-----------------------------------------+|v+-----------------------------------------+|        調用 reverse() 反轉前 k 個元素      ||             [5,6,7,4,3,2,1]             |+-----------------------------------------+|v+-----------------------------------------+|              打印當前數組狀態             ||              [5,6,7,4,3,2,1]            |+-----------------------------------------+|v+-----------------------------------------+|        調用 reverse() 反轉剩余元素         ||              [5,6,7,1,2,3,4]            |+-----------------------------------------+|v+-----------------------------------------+|              打印當前數組狀態              ||             [5,6,7,1,2,3,4]             |+-----------------------------------------+|v+-----------------------------------------+|                返回結果                  |+-----------------------------------------+

參考代碼

C++
#include <iostream>
#include <vector>using namespace std;class Solution {
public:void rotate(vector<int>& nums, int k) {int n = nums.size();k %= n; // 處理 k 大于數組長度的情況if (k == 0) return; // 如果 k 等于 0,直接返回// 翻轉整個數組reverse(nums.begin(), nums.end());// 翻轉前 k 個元素reverse(nums.begin(), nums.begin() + k);// 翻轉剩余元素reverse(nums.begin() + k, nums.end());}
};int main() {vector<int> nums = {1, 2, 3, 4, 5, 6, 7}; // 輸入數組int k = 3; // 向右輪轉的位置數Solution solution;solution.rotate(nums, k); // 調用 rotate 方法cout << "旋轉后的數組:";for (int num : nums) {cout << num << " ";}cout << endl;return 0;
}
Java
import java.util.Arrays;class Solution {public void rotate(int[] nums, int k) {int n = nums.length;k %= n; // 處理 k 大于數組長度的情況if (k == 0) return; // 如果 k 等于 0,直接返回// 翻轉整個數組reverse(nums, 0, n - 1);// 翻轉前 k 個元素reverse(nums, 0, k - 1);// 翻轉剩余元素reverse(nums, k, n - 1);}private void reverse(int[] nums, int start, int end) {while (start < end) {int temp = nums[start];nums[start] = nums[end];nums[end] = temp;start++;end--;}}public static void main(String[] args) {int[] nums = {1, 2, 3, 4, 5, 6, 7}; // 輸入數組int k = 3; // 向右輪轉的位置數Solution solution = new Solution();solution.rotate(nums, k); // 調用 rotate 方法System.out.print("旋轉后的數組:");for (int num : nums) {System.out.print(num + " ");}System.out.println();}
}
Python
class Solution:def rotate(self, nums: List[int], k: int) -> None:n = len(nums)k %= n  # 處理 k 大于數組長度的情況if k == 0:return  # 如果 k 等于 0,直接返回# 翻轉整個數組self.reverse(nums, 0, n - 1)# 翻轉前 k 個元素self.reverse(nums, 0, k - 1)# 翻轉剩余元素self.reverse(nums, k, n - 1)def reverse(self, nums: List[int], start: int, end: int) -> None:while start < end:nums[start], nums[end] = nums[end], nums[start]start += 1end -= 1if __name__ == "__main__":nums = [1, 2, 3, 4, 5, 6, 7]  # 輸入數組k = 3  # 向右輪轉的位置數solution = Solution()solution.rotate(nums, k)  # 調用 rotate 方法print("旋轉后的數組:", nums)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/10614.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10614.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10614.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

YOLOv8訓練流程-原理解析[目標檢測理論篇]

關于YOLOv8的主干網絡在YOLOv8網絡結構介紹-CSDN博客介紹了&#xff0c;為了更好地學習本章內容&#xff0c;建議先去看預測流程的原理分析YOLOv8原理解析[目標檢測理論篇]-CSDN博客&#xff0c;再次把YOLOv8網絡結構圖放在這里&#xff0c;方便隨時查看。 ? 1.前言 YOLOv8訓練…

Map中KEY去除下劃線并首字母轉換為大寫工具類

在運維舊項目時候&#xff0c;碰上sql查詢結果只能返回List<Map>&#xff0c;key為表單字段名&#xff0c;value為獲取到的結果數據。 懶得一個一個敲出來&#xff0c;就直接寫個方法轉換&#xff0c;并賦值到相應實體對象里去。 Map中KEY去除下劃線并首字母轉換為大寫&…

算法提高之矩陣距離

算法提高之矩陣距離 核心思想&#xff1a;多源bfs 從多個源頭做bfs&#xff0c;求距離 先把所有1的坐標存入隊列 再把所有1連接的位置存入 一層一層求 #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N 1…

Kafka 面試題(八)

1. Kafka&#xff1a;硬件配置選擇和調優的建議 &#xff1f; Kafka的硬件配置選擇和調優是確保Kafka集群高效穩定運行的關鍵環節。以下是一些建議&#xff1a; 硬件配置選擇&#xff1a; 內存&#xff08;RAM&#xff09;&#xff1a;建議至少使用32GB內存的服務器。為Kafk…

Web3Tools - 助記詞生成

Web3Tools - 助記詞生成工具 本文介紹了一個簡單的助記詞生成工具&#xff0c;使用 React 和 Material-UI 構建。用戶可以選擇助記詞的語言和長度&#xff0c;然后生成隨機的助記詞并顯示在頁面上 功能介紹 選擇語言和長度&#xff1a; 用戶可以在下拉菜單中選擇助記詞的語言&…

uniapp 圖片添加水印代碼封裝(優化版、圖片上傳壓縮、生成文字根據頁面自適應比例、增加文字背景色

uniapp 圖片添加水印代碼封裝(優化版、圖片上傳壓縮、生成文字根據頁面自適應比例、增加文字背景色 多張照片上傳封裝 <template><view class"image-picker"><uni-file-picker v-model"imageValue" :auto-upload"false" :title…

關于服務端接口知識的匯總

大家好&#xff0c;今天給大家分享一下之前整理的關于接口知識的匯總&#xff0c;對于測試人員來說&#xff0c;深入了解接口知識能帶來諸多顯著的好處。 一、為什么要了解接口知識&#xff1f; 接口是系統不同模塊之間交互的關鍵通道。只有充分掌握接口知識&#xff0c;才能…

http-server實現本地服務器

要實現一個本地服務器&#xff0c;你可以使用Node.js的http-server模塊。首先&#xff0c;確保你已經安裝了Node.js和npm。然后&#xff0c;按照以下步驟操作&#xff1a; 打開終端或命令提示符&#xff0c;進入你想要作為服務器根目錄的文件夾&#xff1b;運行以下命令安裝ht…

Axure PR 10 制作頂部下拉三級菜單和側邊三級菜單教程和源碼

在線預覽地址&#xff1a;Untitled Document 2.側邊三級下拉菜單 在線預覽地址&#xff1a;Untitled Document 文件包和教程下載地址&#xff1a;https://pan.quark.cn/s/77e55945bfa4 程序員必備資源網站&#xff1a;天夢星服務平臺 (tmxkj.top)

Linux x86_64 dump_stack()函數基于FP棧回溯

文章目錄 前言一、dump_stack函數使用二、dump_stack函數源碼解析2.1 show_stack2.2 show_stack_log_lvl2.3 show_trace_log_lvl2.4 dump_trace2.5 print_context_stack 參考資料 前言 Linux x86_64 centos7 Linux&#xff1a;3.10.0 一、dump_stack函數使用 dump_stack函數…

Unity開發中導彈路徑散射的原理與實現

Unity開發中導彈路徑散射的原理與實現 前言邏輯原理代碼實現導彈自身腳本外部控制腳本 應用效果結語 前言 前面我們學習了導彈的追蹤的效果&#xff0c;但是在動畫或游戲中&#xff0c;我們經常可以看到導彈發射后的彈道是不規則的&#xff0c;扭扭曲曲的飛行&#xff0c;然后擊…

數字生態系統的演進與企業API管理的關鍵之路

數字生態系統的演進與企業API管理的關鍵之路 在數字化時代&#xff0c;企業正經歷著一場轉型的浪潮&#xff0c;而API&#xff08;應用程序編程接口&#xff09;扮演著至關重要的角色。API如同一座橋梁&#xff0c;將組織內部的價值轉化為可市場化的產品&#xff0c;從而增強企…

韓國站群服務器在全球網絡架構中的重要作用?

韓國站群服務器在全球網絡架構中的重要作用? 在全球互聯網的蓬勃發展中&#xff0c;站群服務器作為網絡架構的核心組成部分之一&#xff0c;扮演著至關重要的角色。韓國站群服務器以其卓越的技術實力、優越的地理位置、穩定的網絡基礎設施和強大的安全保障能力&#xff0c;成…

LeetCode 題目 118:楊輝三角

題目描述 給定一個非負整數 numRows&#xff0c;生成楊輝三角的前 numRows 行。在楊輝三角中&#xff0c;每個數是它左上方和右上方的數的和。 楊輝三角解析 在這個詳解中&#xff0c;我們將使用 ASCII 圖形來說明楊輝三角的構建過程&#xff0c;包括逐行添加新的行的過程。…

250 基于matlab的5種時頻分析方法((短時傅里葉變換)STFT

基于matlab的5種時頻分析方法&#xff08;(短時傅里葉變換)STFT,Gabor展開和小波變換,Wigner-Ville&#xff08;WVD&#xff09;,偽Wigner-Ville分布(PWVD),平滑偽Wigner-Ville分布&#xff08;SPWVD&#xff09;,每條程序都有詳細的說明&#xff0c;設置仿真信號進行時頻輸出。…

Parted分區大容量磁盤

創建了新的虛擬磁盤10T , 掛載后分區格式化一.fdisk無法創建大容量的分區 Fileserver:~ # fdisk /dev/sdb Welcome to fdisk (util-linux 2.29.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device …

使用html和css實現個人簡歷表單的制作

根據下列要求&#xff0c;做出下圖所示的個人簡歷&#xff08;表單&#xff09; 表單要求 Ⅰ、表格整體的邊框為1像素&#xff0c;單元格間距為0&#xff0c;表格中前六列列寬均為100像素&#xff0c;第七列 為200像素&#xff0c;表格整體在頁面上居中顯示&#xff1b; Ⅱ、前…

git提交代碼異常報錯error:bad signature 0x00000000

報錯信息 error:bad signature 0x00000000 異常原因 git 提交過程中異常關機或重啟&#xff0c;造成當前項目工程中的.git/index 文件損壞&#xff0c;無法提交 解決步驟 刪除.git/index文件 rm -f .git/index 重啟git git reset

Java 【數據結構】 哈希(Hash超詳解)HashSetHashMap【神裝】

登神長階 第十神裝 HashSet 第十一神裝 HashMap 目錄 &#x1f454;一.哈希 &#x1f9e5;1.概念 &#x1fa73;2.Object類的hashCode()方法: &#x1f45a;3.String類的哈希碼: &#x1f460;4.注意事項: &#x1f3b7;二.哈希桶 &#x1fa97;1.哈希桶原理 &#x…

Bert基礎(二十二)--Bert實戰:對話機器人

一 、概念簡介 1.1 生成式對話機器人 1.1.1什么是生成式對話機器人? 生成式對話機器人是一種能夠通過自然語言交互來理解和生成響應的人工智能系統。它們能夠進行開放域的對話,即在對話過程中,機器人可以根據用戶的需求和上下文信息,自主地生成新的、連貫的回復,而不僅…