演算法學習之字串左移 右移

2021-09-30 14:52:21 字數 1411 閱讀 3917

1.設計乙個演算法,把乙個含有n個元素的陣列迴圈右移k位,要求時間複雜度為o(n),

且只允許使用兩個附加變數。

方法一:

每次將陣列中的元素右移一位,迴圈k次,則實現了右移k位。

例如,原始字串:abcd1234

右移一位:4abcd123

右移一位:34abcd12

右移一位:234abcd1

右移一位:1234abcd

迴圈4次,則實現了右移4次

實現函式如下:

void right_shift(char *str, int n, int k)

}

從上面的實現**可以看出,

由於k %= n, 所以while迴圈的k值是小於n的。所以時間複雜度最大為o(n^2), 空間複雜度為o(1),不符合題目要求。

方法二:

對於原始字串abcd1234,右移2位後為:34abcd12。

通過比較可以看出,有兩段子字串的順序是不變的。abcd12和34。

則可發現,右移k位的過程就是把陣列的兩部分交換的過程。

例如:abcd12|34.

對abcd12逆序排列:21dcba

對34逆序排列: 43

對全部的21dcba|43進行逆序排列:34abcd21.

得出如下結論:

將字串s="abcd1234"分為兩部分x="abcd12"和y="34"。那麼s=(x, y)

x逆序記為x'="21dcba"

y逆序記為y'="43"

則(x', y')="21dcba43"整體再逆序為"34abcd12" = (y, x)

即(x', y')' = (y, x)

**實現如下:

void reverse(char* str, int begin, int end)

}void right_shift(char *str, int n, int k)

編寫主函式測試如下:

#include #include int main()

2.實現對字串進行左旋轉的函式,要求對長度為n的字串操作的時間複雜度為o(n), 空間複雜度為o(1).

例如,原始字串:abcd1234,左旋轉2位後為:cd1234ab

通過上面的1的分析,只是把右移改為左移。其他方法相同。

**實現如下:

void reverse(char* str, int begin, int end)

}void right_shift(char *str, int n, int k)

int main()

內容整理於:

演算法學習之字串全排列

第一種方法字串全排列,思想上和我們高中學的排列一樣,比如123,開始的時候第乙個位置有三種選擇,第乙個選完之後第二個位置就只剩下兩種選擇,第三個位置,就剩一種,所以一共有n 種排列,所以我們可以用遞迴的思想去做,遞迴中做交換 include include define max 50 void sw...

演算法學習之陣列和字串

陣列和字串 逆序輸出 考慮問題 讀入一些整數,逆序輸出到一行中。已知整數不超過100個。我們把每個數都存下來,存放到 呢?答案是 陣列。include include define maxn 100 10 inta maxn intmain for i n 1 i 1 i printf d n a ...

演算法學習之陣列和字串

陣列和字串 逆序輸出 考慮問題 讀入一些整數,逆序輸出到一行中。已知整數不超過100個。我們把每個數都存下來,存放到 呢?答案是 陣列。include include define maxn 100 10 inta maxn intmain for i n 1 i 1 i printf d n a ...