劍指offer 面試題57 和為s的兩個數

2021-10-06 21:23:04 字數 3480 閱讀 5354

輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得他們的和正好是s,如果有多對數字的和等於s,輸出兩個數的乘積最小的。

isinstance() 函式來判斷乙個物件是否是乙個已知的型別,類似 type()。

type() 不會認為子類是一種父類型別,不考慮繼承關係。

isinstance() 會認為子類是一種父類型別,考慮繼承關係。

如果要判斷兩個型別是否相同推薦使用 isinstance()。

例1):

# >>

>a =

2# >>

> isinstance (a,

int)

true

例2):

classa:

pass

class

b(a)

: pass

isinstance(a

(), a) # returns true

type(a

())== a # returns true

isinstance(b

(), a) # returns true

type(b

())== a # returns false)

enumerate() 函式用於將乙個可遍歷的資料物件(如列表、元組或字串)組合為乙個索引序列,同時列出資料和資料下標,一般用在 for 迴圈當中。

例:

seq =

['one'

,'two'

,'three'

]for i, element in enumerate

(seq)

:print

(i, element)

輸出:0 one

1 two

2 three

兩個游標i,j分別從開始和結尾的元素開始相加,>tsum 則j左移,class

solution()

: # 法一:

def findnumberswithsum_1

(self, array, tsum)

: left, right =0,

len(array)-1

# ls=

while left < right:

if array[left]

+ array[right]

> tsum:

right -=1

elif array[left]

+ array[right]

< tsum:

left +=1

else

:return

[array[left]

, array[right]]s=

solution()

print

(s.findnumberswithsum_2([

1,2,

3,4,

6,7,

9,15]

,7))用列表第乙個和後面每乙個元素相加,第二個和後面每乙個元素相加,。。。直到v+v1=tsum,輸出[v,v1]

class

solution()

: def findnumberswithsum_2

(self, array, tsum)

: # 法二:

ls =

ifnot

isinstance

(array,list)

:return ls

for i,v in enumerate

(array)

:for v1 in array[i+1:

]:if v+v1==tsum:

return

[v,v1]

# if ls:

# return ls[0]

return ls

s=solution()

print

(s.findnumberswithsum_2([

1,2,

3,4,

6,7,

9,15]

,7))

小明很喜歡數學,有一天他在做數學作業時,要求計算出9~16的和,他馬上就寫出了正確答案是100。但是他並不滿足於此,他在想究竟有多少種連續的正數序列的和為100(至少包括兩個數)。沒多久,他就得到另一組連續正數和為100的序列:18,19,20,21,22。現在把問題交給你,你能不能也很快的找出所有和為s的連續正數序列?

>> 和 《都是位運算,

<< 是左移,相當於原數x乘2。比如整數4在二進位制下是100,4<<1左移1位變成1000(二進位制),結果是8。

>>是右移,相當於除以2。

# -

*- coding:utf-8-

*-class

solution

: def findcontinuoussequence

(self, tsum)

:"""

使用滑動視窗的方法來解決,

設定乙個動態的視窗,p_low指向視窗頭部,

p_high指向視窗尾部,視窗之間的值,為目標值。

如果目標值為tsum,那就是其中乙個解。否則移動視窗。

:param tsum:

""" #錯誤判斷處理,如果小於3的話 無解

if tsum <3:

return

#設定初始的滑動視窗大小

p_low =

1 p_high =

2 ans =

while p_low < p_high:

#計算滑動視窗現在圈中的大小

cur_sum =

sum(

range

(p_low,p_high+1)

)if cur_sum == tsum:

#找到一組解,並記錄到ans陣列中。

ans.

(range

(p_low,p_high+1)

) #移動滑動視窗,並尋找下一組解。

p_high = p_high +

1 elif cur_sum < tsum:

p_high = p_high +

1else

: p_low = p_low +

1return ans

if __name__ ==

'__main__'

: s =

solution()

print s.

findcontinuoussequence

(100

)

劍指offer 面試題 57 和為 S 的數字

輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,是的他們的和正好是s,如果有多對數字的和等於s,輸出兩個數的乘積最小的。對應每個測試案例,輸出兩個數,小的先輸出。時間限制 1秒 空間限制 32768k 熱度指數 62731 思路 要找兩個數的和為s,並不難,但是如果存在多個符合這樣要求的數,...

劍指offer 面試題57 和為s的數字

輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得他們的和正好是s,如果有多對數字的和等於s,輸出兩個數的乘積最小的。解決 public arraylistfindnumberswithsum int array,int sum else if array left array right...

劍指Offer 面試題57 和為 s 的數字

題目 輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得它們的和正好是s。如果有多對數字的和等於s,輸出任意一對即可。題目 輸入乙個正數s,列印出所有和為s的連續正數序列 至少含有兩個數 例如輸入15,由於1 2 3 4 5 4 5 6 7 8 15,所以結果列印出3個連續序列1 5 4 ...