Lintcode Python之移動零

2021-08-09 05:42:58 字數 2804 閱讀 5995

題目:

給乙個陣列 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 plt

plt.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 第一次思路 直接遍歷陣列,找出三個數,然後判斷是否滿足三角形條件 滿足三角形的條件有兩...