Java 程式用於在常數時間內查詢給定字串的旋轉和第 K 個字元


在這個問題中,程式設計師需要對字串執行查詢。此外,還需要旋轉字串並列印更新後的字串的字元。解決此問題的最佳方法是不斷更新索引值,並在需要列印字元時訪問字串字元。

問題陳述 – 我們給定字串 alpha 和包含名為 'que' 的數字對的陣列。任務是在字串 alpha 上執行陣列中給出的查詢。

遵循以下查詢操作規則。

  • (1, a) – 對給定字串進行總共左旋轉。

  • (2, a) – 列印第 a 個位置的字元。

注意 – 這裡,a 的值是 1 到 N,其中 N 是字串的長度。

示例

輸入

que[][] = { { 1, 1 }, { 2, 1 }, { 2, 5 }, { 1, 3 } }, alpha = "wqedsdcs";

輸出

q, d

解釋 – 讓我們逐一在字串上執行所有查詢。

  • 第一個查詢將字串旋轉 1 位,更新後的字串將為 'qedsdcsw'。

  • 第二個查詢列印第 1 個位置的字元,即 'q'。

  • 第三個查詢列印第 5 個位置的字元,即 'd'。

  • 第四個查詢進行 3 次左旋轉。

輸入

que[][] = { { 1, 1 }, { 2, 3 }, { 1, 8 }, { 2, 7 } }, alpha = "tutorialspoint"

輸出

o, u

解釋

  • 執行第一個查詢後,字串變為 'utorialspoint'。

  • 更新後的字串中第 3 個位置的字元是 'o'。

  • 執行第三個查詢後,字串變為 'pointtutorials'。

  • 第 7 個位置的字元是 'u'。

方法 1

在這種方法中,我們定義索引指標來跟蹤當前索引。我們跟蹤最後一個索引以在最後一個索引上執行下一個查詢。

演算法

步驟 1 – 定義 'curr' 變數以跟蹤最新索引。

步驟 2 – 使用 for 迴圈遍歷查詢陣列。

步驟 3 – 從第 m 個索引獲取查詢,如果查詢對的第一個元素為 1,我們需要對最後更新的字串進行 'a' 次旋轉。

步驟 4 – 在這種情況下,我們將 'curr' 值更新為將對的第二個元素新增到 'curr' 並取其對 26 的模。

步驟 5 – 如果查詢對的第一個元素為 2,我們需要列印給定索引處的字元。

步驟 6 – 將 'curr' 變數的值更新為將查詢對的第二個元素新增到 'curr' 並取其對 26 的模。

步驟 7 – 訪問原始字串中 'curr' 索引處的字元。此外,在輸出中顯示字元。

示例

import java.util.*;

public class main {
    static void executeQueries(String alpha, int str_len, int que[][], int que_len) {
        // Current pointer pointing to the starting
        int curr = 0;
        // Traverse array
        for (int m = 0; m < que_len; m++) {
            // Query rotation
            if (que[m][0] == 1) {
                // Update value of curr
                curr = (curr + que[m][1]) % str_len;
            } else {
                int ch = que[m][1];
                // Get the index of the character in rotation
                int index = (curr + ch - 1) % str_len;
                // Show output
                System.out.println(alpha.charAt(index));
            }
        }
    }
    public static void main(String[] args) {
        String alpha = "wqedsdcs";
        int str_len = alpha.length();
        int que[][] = { { 1, 1 }, { 2, 1 },
                { 2, 5 }, { 1, 3 } };
        int que_len = que.length;
        executeQueries(alpha, str_len, que, que_len);
    }
}

輸出

q
d

時間複雜度 – O(M),因為我們逐一執行所有查詢。

空間複雜度 – O(1),因為我們沒有使用任何動態空間。

程式設計師也可以嘗試使用樸素方法來解決問題。在樸素方法中,程式設計師可以旋轉字串以執行第一個查詢,並訪問更新後的字串中的字元以執行第二個查詢。執行字串旋轉的方法有 1 到 2 種不同的方法;一種是將字串與其自身連線起來並獲取其子字串。

更新於: 2023年8月24日

68 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告