完整**(c++)
已知在一維陣列[m+n]中依次存放兩個線性表(a1,a2,…,am)和(b1,b2,…,bn),現要將這兩個順序表位置互換。
本題也可以理解為要將陣列中的元素序列迴圈左移m個位置。
第一種
將兩個線性表各看成乙個整體,用(t=a,a=b,b=t)的方法進行交換,這種方法思路非常簡單好懂,但是執行起來比較麻煩,這裡為了方便程式設計,直接令臨時陣列t的長度為m,演算法空間複雜度為o(m);
第二種
用陣列元素逆置的方法,假設a代表陣列前m個元素,b代表陣列餘下的n個元素,那麼這個問題實際上就是如何把陣列ab換成ba。
對於陣列ab,先將a逆置得到a-1b,再將b逆置得到a-1b-1。最後對整個陣列進行逆置(a-1b-1)-1,即可得到ba。
舉個例子,設函式reverse執行陣列元素逆置的操作,現在有一組陣列[1,2,3,4,5,6,7,8],要迴圈左移3個元素。具體變化過程如下:
reverse(0,2),得到[3,2,1,4,5,6,7,8];
reverse(3,7),得到[3,2,1,8,7,6,5,4];
reverse(0,7),得到[1,2,3,4,5,6,7,8]。
該演算法中三個reverse的時間複雜度分別為o(m/2)、o(n/2)、o(m+n/2),故時間複雜度為o(m+n),空間複雜度為o(1)。
整體代換法
void
exchange
(datatype a
, int m, int n, int arraysize)
//逆置方法
void
reverse
(datatype a
, int left, int right)
逆置為//注意,傳值時,left和right均為陣列的下標,而不是準確的位置
if(left >= right)
return
;//判斷逆置區間
for(int i =
0; i <=
(right - left)/2
; i++)}
void
exchangeab
(datatype a
, int m, int n)
//函式功能:
//實現一維陣列中兩個順序表的位置互換
#include
using namespace std;
typedef int datatype;
//整體代換法
void
exchange
(datatype a
, int m, int n, int arraysize)
//逆置方法
void
reverse
(datatype a
, int left, int right)
逆置為//注意,傳值時,left和right均為陣列的下標,而不是準確的位置
if(left >= right)
return
;//判斷逆置區間
for(int i =
0; i <=
(right - left)/2
; i++)}
void
exchangeab
(datatype a
, int m, int n, int arraysize)
void
print
(datatype a
, int length)
void
main()
;print(ab
,7);
exchange(ab
,3,4
,7);
//exchangeab(ab, 3, 4, 7);
print(ab
,7);
}
交換陣列中兩個元素的位置
簡單的交換陣列中倆個元素的位置,交換後為.同樣交換倆個數字,比如這樣的 public static void swap int a,int b 然後再列印的話,實際上是交換不了的。因為此時的 a,b只是形參,我們知道形參的改變不會影響實參的變化,因此交換不了。那麼為什麼陣列可以交換呢,讓我們來看一下...
js改變陣列的兩個元素的位子,互換 置頂
js陣列的元素上移和下移動 var fielddata var index 9 須知 unshift 方法可向陣列的開頭新增乙個或更多元素,並返回新的長度。shift 方法用於把陣列的第乙個元素從其中刪除,並返回第乙個元素的值。splice 方法可刪除從 index 處開始的零個或多個元素,並且用引...
python將句子中兩個子串位置互換的
想要將文中所有的類似 aa citebb citecc 替換為aa cite bb cite cc 即 與 cite 互換位置 採用非貪婪匹配,邊界條件都用 來匹配即可。import sys import os import re def changefile filename p re.compi...