題目:
給乙個陣列 nums 寫乙個函式將 0 移動到陣列的最後面,非零元素保持原陣列的順序。
樣例:給出 nums = [0, 1, 0, 3, 12], 呼叫函式之後, nums = [1, 3, 12, 0, 0].
注意事項
1.必須在原陣列上操作
2.最小化運算元
思路:(1)
移動賦值的話,想到雙指標首尾靠近遍歷,版本一的**出來了:
def
movezeroes
(self, nums):
# write your code here
i, j = 0, len(nums)-1
# 首尾指標
while i<=j:
if nums[i]==0:
while nums[j]!=0:
nums[i], nums[j] = nums[j], nums[i] #交換值
else:
j -= 1
i += 1
但是這個沒有考慮到題目要求的非零元素保持原陣列的順序。fail
(2)
def
movezeroes
(self, nums):
# write your code here
n = nums.count(0)
for i in range(n):
nums.remove(0)
i += 1
(3)
還有其他高手也寫出更短的**:
def
movezeroes
(self, nums):
# write your code here
for num in nums:
if num == 0:
nums.remove(0)
測試
如果不考慮非零元素保持原陣列的順序這一條件,版本一的**灰常快。
來看看以下比較
from timeit import timeit # 計時器測試過程:deffunc1
(): num = nums.count(0)
for i in range(num):
nums.remove(0)
i += 1
deffunc2
():for i in nums:
if i == 0:
nums.remove(0)
""" 版本一 **"""
deffunc3
(): i, j = 0, len(nums)-1
while i <= j:
if nums[i] == 0:
while nums[j] != 0:
nums[i], nums[j] = nums[j], nums[i]
else:
j -= 1
i += 1
import random
f1, f2, f3, f4, f5 = * 5
for i in range(30):
nums = [random.randint(0, i) for j in range(600)] #每次隨機產生600個0~i的數字
print(sum(f1)/30, sum(f2)/30, sum(f3)/30, sum(f4)/sum(f2), sum(f5)/sum(f2), sep="||")
# 輸出每個函式的平均執行時間,執行時間差值佔比
執行結果如下:
0.06555597698982941||0.06603924254365362||0.011495922738686205||-0.0073178542819409935||-0.8259228559278659
可以看到,不考慮非零元素保持原陣列的順序這一條件的話,最初版本的**比其他兩個快了80%左右;
而**二和**三(最短的那個**)差別不大。這個測試對於**二和**三還是比較粗糙的。
再附上詳細一點的測試**:
l =
random.seed(42)
for j in range(100): # 重複100次
f1 =
f2 =
f3 =
for i in range(1):
nums = [random.randint(0, i+3) for j in range(500)]
畫圖檢視結果
import matplotlib.pyplot as pltplt.figure(figsize=(18, 5))
plt.subplot(121)
plt.hist(l)
plt.subplot(122)
plt.plot(range(100), l)
plt.show()
print(sum(l)/len(l)) # **二比**三執行總時長短s秒
#列印出》-0.0008692948313910165
總結:在0的個數佔比較少時**二速度優於**三幾個百分點,反之**三優於**二。波動性這麼大的原因之一應該就是0的位置不確定,越靠後,**二執行時長就長一點點。但總的來說,交叉點大概在0 的個數佔比為40%左右。
分析思路僅供參考–>逃
Lintcode python之兩陣列的交
返回兩個陣列的交 樣例 nums1 1,2,2,1 nums2 2,2 返回 2 python 的set集合就有交集的操作,而且順帶去重,簡直爽歪歪,直接用set,一行 搞定。class solution param nums1 an integer array param nums2 an int...
lintcode python 最長公共字串
最長公共字串 問題描述 給出兩個字串,找到最長公共子串,並返回其長度。如下 class solution def longestcommonsubstring self,a,b l if a or b 排除特殊情況 return 0 for i in range len a for j in ran...
LintCode python 小白3 三角形計數
題目 給定乙個整數陣列,在該陣列中,尋找三個數,分別代表三角形三條邊的長度,問,可以尋找到多少組這樣的三個數來組成三角形?樣例 例如,給定陣列 s 返回 3 其中我們可以找到的三個三角形為 給定陣列 s 返回 4 第一次思路 直接遍歷陣列,找出三個數,然後判斷是否滿足三角形條件 滿足三角形的條件有兩...