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 ...