一般for
迴圈中總會用到range
函式來進行順序遍歷,同樣的,range
也能表示序列的逆序。
在range(start, end, step)
中,start 表示序列的起始索引(預設為0),end 表示終止索引,step 表示移動步長(預設為1)。由於range
函式是「顧頭不顧尾」 的形式,因此實際上其遍歷的索引終止位置是 end 的前乙個索引。
比如:
list
(range(5
))=[
0,1,
2,3,
4]list
(range(1
,5))
=[1,
2,3,
4]list
(range(1
,5,1
))=[
1,2,
3,4]
list
(range(1
,5,2
))=[
1,3]
同理,逆序遍歷只需將步長 step 設為負值即可。
比如:
list
(range(5
,1,-
1))=
[5,4
,3,2
]list
(range(5
,-2,
2))=
[5,3
,1,-
1]
這樣,在for
迴圈中既可以實現順序遍歷,也可以進行逆序遍歷。
在 python3 中,reversed
函式也能夠逆轉列表。
其實,在 python2.7 中就存在內建函式reverse
可以用來翻轉列表,不過在 python3 中已經刪去該函式。
相比於reverse
函式只能反轉列表,reversed
函式則可以翻轉多種序列,包括tuple、list、string、range等型別。
由於reversed
函式實際上是乙個類,因此其直接輸出的是對應序列值反轉後的迭代器,需要由對應型別的方法獲取反轉後的值。
比如:
# 列表反轉
a =[1,
2,3,
4,5]
print
(reversed
(a))
# 輸出:
print
(list
(reversed
(a))
)# 輸出:[5, 4, 3, 2, 1]
# 元組反轉
a =(1,
2,3,
4,5)
print
(reversed
(a))
# 輸出:
print
(tuple
(reversed
(a))
)# 輸出:(5, 4, 3, 2, 1)
# 字串反轉
a ='12345'
print
(reversed
(a))
# 輸出:
print
(str
(reversed
(a))
)# 輸出:
print(""
.join(
reversed
(a))
)# 輸出:54321
注意:不過,list、tuple、range 型別均可相互轉換,但str型別不同;
str型別反轉序列輸出採用
"".join(reversed(string)))
方法,即將反轉序列按順序新增進新的字串序列中。
reversed
函式只能對已有序列做完全反轉,若只是想對序列其中一部分進行反轉,需要先擷取對應序列再反轉,也可以用range
函式遍歷所需部分序列。
除了以上兩種方法外,對於字串序列,還可以用切片反轉方法進行反轉。
比如:
a =
'hello world'
print(""
.join(
reversed
(a))
)# 輸出:dlrow olleh
print
(a[::-
1])# 輸出:dlrow olleh
print
(a[::-
2])# 輸出:drwolh
求序列的逆序數
在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。即,在陣列中,若0 a j 就說明這兩個數是逆序對,乙個陣列中逆序對數量就是逆序數。第一種思路 用兩個for迴圈解決,用第乙個迴圈i從陣列開頭開始,另乙個迴圈...
求序列逆序數
由1,2,n 組成的乙個有序陣列稱為乙個n級排列。在乙個排列中如果一對數的前後位置與大小順 序相反,即大數排在小數的前面,則稱它們為乙個逆序。乙個排列中所有逆序的總和稱為該排列的逆序數。那麼,如何求解乙個序列的逆序數呢?暴力法是問題解的最簡單的方法,下面給出核心 int inversionnumbe...
求序列逆序數
求序列逆序數 整體思路是用到分治的思想,其實該問題可以在歸併排序過程中解決,因此該題 只需要在歸併排序 上增加乙個變數記錄逆序數即可,但正如那個修機器的故事一樣,換釘子不難,但知道在 換釘子卻是非常關鍵。如下,只是在歸併排序的基礎上增加了乙個記錄逆序數的地方 void reverse int num...