在這個問題中,我們將對陣列元素執行給定的查詢。查詢包含陣列元素的循環左旋轉、右旋轉和更新。
解決問題的邏輯部分是陣列旋轉。向左旋轉數組的簡單方法是將每個元素替換為下一個元素,將最後一個元素替換為第一個元素。
我們可以使用deque資料結構來有效率地旋轉陣列。
問題陳述 - 我們給了一個包含整數值的 arr[] 陣列。此外,我們也給了一個包含 K 個查詢的 requests[] 陣列。我們需要根據以下規則對 arr[] 數組元素執行 requests[] 中給出的每個查詢。
{0} - 將陣列進行圓形左旋轉。
{1) - 對陣列進行圓形右旋轉。
{2, p, q} - 用 q 更新第 p 個索引處的元素。
{3, p} - 列印第 p 個索引中的元素。
範例
輸入
arr[] = {8, 9, 13, 44, 76, 67, 21, 51}; queries = {{1}, {0}, {2, 4, 50}, {3, 2}, {2, 2, 223}, {3, 2}};
輸出
13,223
解釋- 讓我們執行每個查詢。
{1} -> 將陣列向右旋轉後,陣列變成 {51, 8, 9, 13, 44, 76, 67, 21}
-
#{0} -> 將更新的陣列向左旋轉後,陣列變成等於 {8, 9, 13, 44, 76, 67, 21, 51}。
-
{2, 4, 50} -> 將索引4 處的元素更新為50 後,陣列變成{8, 9, 13, 44, 50, 67, 21, 51}
{3, 2} -> 它列印第二個索引中的元素。
{2, 2, 223}−> 將第二個索引處的元素更新為 223,陣列變成 {8, 9, 223, 44, 50, 67, 21, 51}。 p>
{3, 2} -> 它列印第二個索引中的元素。
輸入
arr[] = {3, 2, 1}, {{3, 2}, {3, 0}}
輸出
1,3
說明 - 它從第 2 和第 0 個索引列印陣列。
輸入
arr[] = {76,20,51,78}, queries={{1},{1},{3, 1}}
輸出
78
解釋- 將陣列向右旋轉 2 次後,陣列變成 [51, 78, 76, 20]。第一個索引處的元素是 78。
方法 1
在這種方法中,我們將遍歷每個查詢並根據給定的查詢執行操作。我們將數組中的每個元素替換為下一個元素,以將其向左旋轉,並將每個元素替換為前一個元素,以將其向右旋轉。
演算法
第 1 步- 開始遍歷每個查詢。
步驟 2− 如果查詢[p][0]等於 0,請依照下列步驟操作。
步驟 2.1- 使用陣列的第一個元素初始化「temp」變數。
步驟 2.2- 開始遍歷數組,並將每個元素替換為下一個元素。
步驟 2.3- 將最後一個元素替換為「temp」值。
第 3 步− 如果查詢[p][0] 等於 1,請依照下列步驟操作。
步驟 3.1- 將陣列的最後一個元素儲存在「temp」變數中。
步驟 3.2- 開始遍歷數組,並將每個元素替換為前一個元素。
步驟 3.3- 使用「temp」值更新第一個元素。
第 4 步- 如果 requests[p][0] 為 2,則使用給定值更新給定索引處的陣列元素。
第 5 步- 如果 requests[p][0] 為 3,則列印給定索引的陣列值。
範例
#include <bits/stdc++.h> using namespace std; void performQueries(int arr[], int N, vector<vector<int>> &queries) { int len = queries.size(); for (int p = 0; p < len; p++) { // For left shift if (queries[p][0] == 0) { // left shift array int temp = arr[0]; for (int p = 0; p < N - 1; p++){ arr[p] = arr[p + 1]; } arr[N - 1] = temp; } // For the right shift else if (queries[p][0] == 1) { // Right shift array int temp = arr[N - 1]; for (int p = N - 1; p > 0; p--){ arr[p] = arr[p - 1]; } arr[0] = temp; } // For updating the value else if (queries[p][0] == 2) { arr[queries[p][1]] = queries[p][2]; } // For printing the value else { cout << arr[queries[p][1]] << " "; } } } int main() { int arr[] = {8, 9, 13, 44, 76, 67, 21, 51}; int N = sizeof(arr) / sizeof(arr[0]); vector<vector<int>> queries; queries = {{1}, {0}, {2, 4, 50}, {3, 2}, {2, 2, 223}, {3, 2}}; performQueries(arr, N, queries); return 0; }
輸出
13 223
時間複雜度 - O(N*K),遍歷查詢並旋轉陣列。
空間複雜度 - O(1),因為我們使用常數空間。
方法2
在這種方法中,我們將使用雙端佇列來儲存陣列元素。之後,要向左旋轉數組,我們可以從隊列中彈出前面的元素並將其推入隊列的末端。同樣,我們可以將數組朝正確的方向旋轉。
演算法
第 1 步- 定義雙端佇列並將所有陣列元素推入佇列。
步驟 2- 使用 for 迴圈遍歷每個查詢。
步驟 3- 若要將陣列向左旋轉,請從佇列開頭刪除第一個元素,並將其推到佇列末端。
第 4 步- 若要沿著正確方向旋轉數組,請從佇列末端刪除一個元素,並將該元素推入開頭。
第 5 步- 根據給定的查詢更新元素或列印元素值。
範例
#include <bits/stdc++.h> using namespace std; void performQueries(int arr[], int N, vector<vector<int>> &queries) { // Queue to insert array elements deque<int> que; // Add elements to queue for (int p = 0; p < N; p++) { que.push_back(arr[p]); } // total queries int len = queries.size(); for (int p = 0; p < len; p++) { // For left shift if (queries[p][0] == 0) { // Get the first element int temp = que[0]; // Remove the first element que.pop_front(); // Push element at the last que.push_back(temp); } // For the right shift else if (queries[p][0] == 1) { // Get the last element int temp = que[N - 1]; // remove the last element que.pop_back(); // Insert element at the start que.push_front(temp); } // For updating the value else if (queries[p][0] == 2) { que[queries[p][1]] = queries[p][2]; } // For printing the value else { cout << que[queries[p][1]] << " "; } } } int main() { int arr[] = {8, 9, 13, 44, 76, 67, 21, 51}; int N = sizeof(arr) / sizeof(arr[0]); vector<vector<int>> queries; queries = {{1}, {0}, {2, 4, 50}, {3, 2}, {2, 2, 223}, {3, 2}}; performQueries(arr, N, queries); return 0; }
輸出
13 223
時間複雜度 - 將陣列元素插入佇列的 O(N K)。
空間複雜度 - 將元素儲存到雙端佇列中的 O(N)。
雙端佇列資料結構允許我們在 O(1) 時間內執行左右旋轉操作。因此,它提高了執行給定查詢的程式碼的效率。
以上是按照給定的查詢重新排列和更新數組元素的詳細內容。更多資訊請關注PHP中文網其他相關文章!

C 和XML的未來發展趨勢分別為:1)C 將通過C 20和C 23標準引入模塊、概念和協程等新特性,提升編程效率和安全性;2)XML將繼續在數據交換和配置文件中佔據重要地位,但會面臨JSON和YAML的挑戰,並朝著更簡潔和易解析的方向發展,如XMLSchema1.1和XPath3.1的改進。

現代C 設計模式利用C 11及以後的新特性實現,幫助構建更靈活、高效的軟件。 1)使用lambda表達式和std::function簡化觀察者模式。 2)通過移動語義和完美轉發優化性能。 3)智能指針確保類型安全和資源管理。

C 多線程和並發編程的核心概念包括線程的創建與管理、同步與互斥、條件變量、線程池、異步編程、常見錯誤與調試技巧以及性能優化與最佳實踐。 1)創建線程使用std::thread類,示例展示瞭如何創建並等待線程完成。 2)同步與互斥使用std::mutex和std::lock_guard保護共享資源,避免數據競爭。 3)條件變量通過std::condition_variable實現線程間的通信和同步。 4)線程池示例展示瞭如何使用ThreadPool類並行處理任務,提高效率。 5)異步編程使用std::as

C 的內存管理、指針和模板是核心特性。 1.內存管理通過new和delete手動分配和釋放內存,需注意堆和棧的區別。 2.指針允許直接操作內存地址,使用需謹慎,智能指針可簡化管理。 3.模板實現泛型編程,提高代碼重用性和靈活性,需理解類型推導和特化。

C 適合系統編程和硬件交互,因為它提供了接近硬件的控制能力和麵向對象編程的強大特性。 1)C 通過指針、內存管理和位操作等低級特性,實現高效的系統級操作。 2)硬件交互通過設備驅動程序實現,C 可以編寫這些驅動程序,處理與硬件設備的通信。

C 適合構建高性能遊戲和仿真係統,因為它提供接近硬件的控制和高效性能。 1)內存管理:手動控制減少碎片,提高性能。 2)編譯時優化:內聯函數和循環展開提昇運行速度。 3)低級操作:直接訪問硬件,優化圖形和物理計算。

文件操作難題的真相:文件打開失敗:權限不足、路徑錯誤、文件被佔用。數據寫入失敗:緩衝區已滿、文件不可寫、磁盤空間不足。其他常見問題:文件遍歷緩慢、文本文件編碼不正確、二進製文件讀取錯誤。

深入解析C語言文件操作難題前言文件操作是C語言編程中一項重要的功能。然而,它也可能是一個有挑戰性的領域,尤其是在處理複雜文件結構時。本文將深入解析C語言文件操作的常見難題,並提供實戰案例來闡明解決方法。打開和關閉文件打開文件時,有兩種主要的模式:r(只讀)和w(寫只)。要打開文件,可以使用fopen()函數:FILE*fp=fopen("file.txt","r");打開文件後,必須在使用完後將其關閉,以釋放資源:fclose(fp);讀取和寫入數據可以使


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

記事本++7.3.1
好用且免費的程式碼編輯器