搜尋
首頁後端開發C++按照給定的查詢重新排列和更新數組元素

按照給定的查詢重新排列和更新數組元素

Sep 14, 2023 pm 04:29 PM
陣列更新重新排列

按照給定的查詢重新排列和更新數組元素

在這個問題中,我們將對陣列元素執行給定的查詢。查詢包含陣列元素的循環左旋轉、右旋轉和更新。

解決問題的邏輯部分是陣列旋轉。向左旋轉數組的簡單方法是將每個元素替換為下一個元素,將最後一個元素替換為第一個元素。

我們可以使用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中文網其他相關文章!

陳述
本文轉載於:tutorialspoint。如有侵權,請聯絡admin@php.cn刪除
C和XML的未來:新興趨勢和技術C和XML的未來:新興趨勢和技術Apr 10, 2025 am 09:28 AM

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

現代C設計模式:構建可擴展和可維護的軟件現代C設計模式:構建可擴展和可維護的軟件Apr 09, 2025 am 12:06 AM

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

C多線程和並發:掌握並行編程C多線程和並發:掌握並行編程Apr 08, 2025 am 12:10 AM

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

C深度潛水:掌握記憶管理,指針和模板C深度潛水:掌握記憶管理,指針和模板Apr 07, 2025 am 12:11 AM

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

C和系統編程:低級控制和硬件交互C和系統編程:低級控制和硬件交互Apr 06, 2025 am 12:06 AM

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

使用C的遊戲開發:構建高性能遊戲和模擬使用C的遊戲開發:構建高性能遊戲和模擬Apr 05, 2025 am 12:11 AM

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

C語言文件操作難題的幕後真相C語言文件操作難題的幕後真相Apr 04, 2025 am 11:24 AM

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

深入解析C語言文件操作難題深入解析C語言文件操作難題Apr 04, 2025 am 11:21 AM

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

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Safe Exam Browser

Safe Exam Browser

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

SublimeText3 Mac版

SublimeText3 Mac版

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

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SublimeText3 英文版

SublimeText3 英文版

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

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器