給定乙個整數陣列,判斷是否存在重複元素。
如果任何值在陣列**現至少兩次,函式返回 true。如果陣列中每個元素都不相同,則返回 false。
這裡的解答用到了投機取巧的一種方法,使用set函式:
class
solution
:def
containsduplicate
(self, nums: list[
int])-
>
bool
: n =
len(nums)
c =len(
set(nums)
)if n>c:
return
true
else
:return
false
介紹:
set() 函式建立乙個無序不重複元素集,可進行關係測試,刪除重複資料,還可以計算交集、差集、並集等。下面說說傳統方法,即雜湊表的python實現:
class
solution
:def
containsduplicate
(self, nums: list[
int])-
>
bool
: dic =
for i in nums:
if dic.get(i)
:return
true
dic[i]=1
return
false
這裡可以看到,實際我們就是使用了字典,字典正是使用雜湊表實現的。
我們這裡使用了get()方法:
介紹:python 字典 get() 函式返回指定鍵的值,如果值不在字典中返回預設值。
返回:返回指定鍵的值,如果值不在字典中返回預設值 none。
給定乙個整數陣列和乙個整數 k,判斷陣列中是否存在兩個不同的索引 i 和 j,使得 nums [i] = nums [j],並且 i 和 j 的差的 絕對值 至多為 k。
這裡仍然是使用雜湊表,也就是字典完成題目,但是我們這次改變鍵值對的配置方法,將數字設定成key,而將數字對應的陣列下標設定為value。然後:
每次檢查新的數字是否存在於這個字典中,若存在,則將當前的陣列下標與字典中相應的key對應的value相減,結果為cha。
比較cha與k的大小,如果大於,就更新這個key的value,如果小於則直接返回true。
下面貼上**:
class
solution
:def
containsnearbyduplicate
(self, nums: list[
int]
, k:
int)
->
bool
: n =
len(nums)
dic=
for i in
range
(n):
if nums[i]
notin dic:
dic[nums[i]]=i
continue
if nums[i]
in dic:
cha=i-dic[nums[i]
]if cha<=k:
return
true
if cha>k:
dic[nums[i]]=i
return
false
這裡發現乙個神奇的用法,就是if nums[i] not in dic,原來字典也可以使用not in這類語句。
乙個「快樂數」定義為:對於乙個正整數,每一次將該數替換為它每個位置上的數字的平方和,然後重複這個過程直到這個數變為 1,也可能是無限迴圈但始終變不到 1。如果可以變為 1,那麼這個數就是快樂數。
這個做法使用的是hashset,首先定義乙個函式用於更新n,然後每次更新n都檢查n是否在已經分配的乙個集合中,如果在,就把n加進集合中,最後檢查n是否為1。
class
solution
:def
(self, n:
int)
->
bool
:def
getnext
(n):
total_sum=
0while n>0:
n,yu =
divmod
(n,10
) total_sum += yu**
2return total_sum
seen =
set(
)while n !=
1and n not
in seen:
seen.add(n)
n=getnext(n)
return n ==
1
這裡學到乙個nb的寫法用於計算乙個數所有數字的平方和,那就是:
sum([
int(i)**2
for i in
str(n)
])
給你兩個有序整數陣列 nums1 和 nums2,請你將 nums2 合併到 nums1 中,使 num1 成為乙個有序陣列。
初始化 nums1 和 nums2 的元素數量分別為 m 和 n 。
你可以假設 nums1 有足夠的空間(空間大小大於或等於 m + n)來儲存 nums2 中的元素。
這個題目我初始想到的就是利用sort和del,但是這樣資源消耗比較多,下面是**:
class
solution
:def
merge
(self, nums1: list[
int]
, m:
int, nums2: list[
int]
, n:
int)
->
none
:"""
do not return anything, modify nums1 in-place instead.
"""for i in
range
(n):
nums1.insert(m,nums2[i]
)del nums1[m+n:
] nums1.sort(
)
class
solution
(object):
defmerge
(self, nums1, m, nums2, n)
:"""
:type nums1: list[int]
:type m: int
:type nums2: list[int]
:type n: int
:rtype: void do not return anything, modify nums1 in-place instead.
"""# make a copy of nums1.
nums1_copy = nums1[
:m]
nums1[:]
=[]# two get pointers for nums1_copy and nums2.
p1 =
0 p2 =
0# compare elements from nums1_copy and nums2
# and add the smallest one into nums1.
while p1 < m and p2 < n:
if nums1_copy[p1]
< nums2[p2]: )
p1 +=
1else:)
p2 +=
1# if there are still elements to add
if p1 < m:
nums1[p1 + p2:
]= nums1_copy[p1:
]if p2 < n:
nums1[p1 + p2:
]= nums2[p2:
]
但這裡有兩行很讓人迷惑,即:
nums1_copy = nums1[:m]
nums1[:] =
這裡學習到了乙個python的語言特性,關於陣列的複製,下面的例子說明了nums1和nums1[:]在被賦值時的區別,也正是為什麼官方這麼進行賦值的原因:
# 物件在記憶體中的位址與id 一一對應,可以使用 id() 檢視並判斷是否是同乙個物件
nums1 =[1
,2,4
,0,0
]print(id
(nums1)
)# 140125129895880
a =[1,
2,3,
4,5]
print(id
(a))
# 140125129856640
nums1[:]
= aprint(id
(nums1)))
# 140125129895880, 仍是原 list 物件, 只不過這一 list 物件的值發生了改變
# 若不執行 nums1[:] = a, 而執行
nums1 = a
print(id
(nums1)
)# 140125129856640, 不再是之前的那個 list 物件
leetcode刷題筆記 陣列2
給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列 現次數大於 n 2 的元素。你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。這道題主體思想是雜湊對映。python的字典就使用了hash的思想。直接貼 class solution def majorityelement s...
leetcode刷題筆記 陣列7
給定乙個排序陣列,你需要在 原地 刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在 原地 修改輸入陣列 並在使用 o 1 額外空間的條件下完成。class solution def removeduplicates self,nums list i...
C 刷題筆記 陣列
在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。利用該二維陣列的性質 所以,對於左下角的值 m,它是該行最小的數,又是該列最大的數。可以從這裡開始比較,按行按...