目錄
方法2
演算法
範例
輸出
首頁 後端開發 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}。

  • {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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

Windows無法存取指定裝置、路徑或文件 Windows無法存取指定裝置、路徑或文件 Jun 18, 2024 pm 04:49 PM

小夥伴電腦出現這樣的故障,開啟「此電腦」和C碟檔案會提示「Explorer.EXEWindows無法存取指定裝置、路徑或檔案。你可能沒有適當的權限存取存取專案。」包括資料夾、檔案、此電腦、回收站等,雙擊都會彈出這樣的窗口,右鍵又是正常的。這是系統更新導致,如果你也遇到這樣的狀況,下面小編教大家如何解決。一,開啟登錄編輯程式Win+R,輸入regedit,或右鍵開始選單執行輸入regedit;二,定位登錄機「電腦\HKEY_CLASSES_ROOT\PackagedCom\ClassInd

如何使用 foreach 迴圈移除 PHP 陣列中的重複元素? 如何使用 foreach 迴圈移除 PHP 陣列中的重複元素? Apr 27, 2024 am 11:33 AM

使用foreach循環移除PHP數組中重複元素的方法如下:遍歷數組,若元素已存在且當前位置不是第一個出現的位置,則刪除它。舉例而言,若資料庫查詢結果有重複記錄,可使用此方法移除,得到不含重複記錄的結果。

PHP數組深度複製的藝術:使用不同方法完美複製 PHP數組深度複製的藝術:使用不同方法完美複製 May 01, 2024 pm 12:30 PM

PHP中深度複製數組的方法包括:使用json_decode和json_encode進行JSON編碼和解碼。使用array_map和clone進行深度複製鍵和值的副本。使用serialize和unserialize進行序列化和反序列化。

Windows永久暫停更新,Windows關閉自動更新 Windows永久暫停更新,Windows關閉自動更新 Jun 18, 2024 pm 07:04 PM

Windows更新可能導致以下一些問題:1.相容性問題:某些應用程式、驅動程式或硬體裝置可能與新的Windows更新不相容,導致它們無法正常運作或崩潰。 2.效能問題:有時,Windows更新可能會導致系統變得更慢或出現效能下降的情況。這可能是由於新的功能或改進需要更多資源來運作。 3.系統穩定性問題:某些用戶報告稱,在安裝Windows更新後,系統可能會出現意外的崩潰或藍屏錯誤。 4.資料遺失:在罕見的情況下,Windows更新可能會導致資料遺失或檔案損壞。這是為什麼在進行任何重要的更新之前,請備份您

PHP 陣列鍵值翻轉:不同方法的效能比較分析 PHP 陣列鍵值翻轉:不同方法的效能比較分析 May 03, 2024 pm 09:03 PM

PHP數組鍵值翻轉方法效能比較顯示:array_flip()函數在大型數組(超過100萬個元素)下比for迴圈效能更優,耗時更短。手動翻轉鍵值的for迴圈方法耗時相對較長。

PHP數組多維排序實戰:從簡單到複雜場景 PHP數組多維排序實戰:從簡單到複雜場景 Apr 29, 2024 pm 09:12 PM

多維數組排序可分為單列排序和嵌套排序。單列排序可使用array_multisort()函數依列排序;巢狀排序需要遞歸函數遍歷陣列並排序。實戰案例包括按產品名稱排序和按銷售量和價格複合排序。

PHP 數組分組函數在資料整理的應用 PHP 數組分組函數在資料整理的應用 May 04, 2024 pm 01:03 PM

PHP的array_group_by函數可依鍵或閉包函數將陣列中的元素分組,傳回關聯數組,其中鍵為組名,值是屬於該組的元素數組。

深度複製PHP數組的最佳實踐:探索高效的方法 深度複製PHP數組的最佳實踐:探索高效的方法 Apr 30, 2024 pm 03:42 PM

在PHP中執行陣列深度複製的最佳實踐是:使用json_decode(json_encode($arr))將陣列轉換為JSON字串,然後再轉換回陣列。使用unserialize(serialize($arr))將陣列序列化為字串,然後將其反序列化為新陣列。使用RecursiveIteratorIterator迭代器對多維數組進行遞歸遍歷。

See all articles