輸入乙個遞增排序的陣列和乙個數字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左移,classsolution()
: # 法一:
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()
(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 ...