1.two sum問題,給定乙個陣列 nums找到陣列中兩個數之和為給定值所有或者(找到即可)組合。
暴力搜尋效率很低,這裡用類似雙指標可以讓時間複雜度達到o(n)
def還有利用python裡的字典來解決的(這裡返回的是索引,當然也可以返回具體的值,不太明白這裡的複雜度是多少):two_sum(nums, target):
res =
nums.sort()
if len(nums) < 2:
return res
elif nums[0] >= target:
return res
else:
begin = 0
end = len(nums)-1
while begin < end:
if nums[begin] + nums[end] == target:
temp = [nums[begin], nums[end]]
begin += 1; end -= 1
elif nums[begin] + nums[end] > target:
end -= 1
else:
begin += 1
return res
nums = [1, 3
, -2, 0
, 5, 4
, 6, 4
, 7]
target = 9
print(two_sum(nums, target))
def2. threesum問題:twosum(num, target):
dict = {}
for i in
range(len(num)):
x = num[i]
if target - x in dict:
return (dict[target - x], i)
dict[x] = i
num = [-3
,-2,0,
1,2,
4,5,
7,-1]
print(twosum(num,
12))
def更新threesum問題:(指定乙個數,然後用兩個指標類似於二分查詢)threesum(nums):
res =
length=len(nums)
if length<3:return res
nums.sort()
for i in
range(length):
if nums[i]>0:break
if i>0
and nums[i]==nums[i-1]:continue
begin=i+1;end=length-1
while begin < end:
sum=nums[i]+nums[begin]+nums[end]
if sum==0:
tmp=[nums[i],nums[begin],nums[end]]
begin+=1;end-=1
while begin < end and nums[begin] == nums[begin - 1]: begin += 1
while begin < end and nums[end] == nums[end + 1]: end -= 1
elif sum>0:end-=1
else:begin+=1
return res
nums = [-1,0
,1,7
,-6,3,
5]print(threesum(nums))
def3. 最長遞增子串行問題:threesum(nums):
ans =
nums.sort()
for i in
range(len(nums) - 2):
if i == 0
or nums[i] > nums[i - 1]: #
如果後個和前個相等,那麼後乙個能實現相加為
target
必然和前面重複
left = i + 1
right = len(nums) - 1
while left < right:
target = nums[left] + nums[right] + nums[i]
if target == 0:
left += 1
right -= 1
while left < right and nums[left] == nums[left-1]: # skip duplicates
left += 1 #兩個
while
也體現了一點點分治
while left < right and nums[right] == nums[right+1]:#
這兩個while
可以一直跳轉到最後的
right -= 1
#數的位置如
[-2,0,0,2,2]
跳轉到3,2
elif target < 0: #
注意while
最後的狀態是第乙個不滿足條件的位置
left += 1
else:
right -= 1
return ans
用貪心的思想:(從前往後,每個數做標記,當前數上的標記為前面比他小的數上最大標記+1,很容易理解,這樣延伸到當前數時可保證是最長的遞增序列)**如下:
def用動態規劃來做:dp(nums):
d = [0]
re = [[0] for
k in nums]
for i in
range(1
, len(nums)):
for j in
range(i):
if nums[j] < nums[i]:
return
max(d)+1
nums = [1,3
,2,4]
print(dp(nums))
4. 求字串最長回文子串的長度(回文子串即是對稱的連續子串)中心展開法,考慮bb這種所以每個字元插入『#』:
deffunc(arr):
re =
new_arr = ''
for i in arr:
new_arr += i+'#'
for i in
range(2
, len(new_arr)-2
, 2):
j = 1
count = 0
while i-j >= 0
and i+j <= len(new_arr)-1:
if new_arr[i-j] == new_arr[i+j]:
count += 1
j += 1
else:
break
return
max(re)+1
arr = 'cabacd'
print(func(arr))
面試手寫方法
陣列 map array.prototype.map function fn filter array.prototype.filter function fn 扁平化 function arr return arr 純數字時使用,若其中有其他型別,則需另外判斷或另行他法 當然,最簡單的是 arr....
面試 手寫函式合集
函式作用 把src的字串放到dst的位置。char strcpy char dst,const char src 該函式是沒有考慮重疊的 char strcpy char dst,const char src else return res 函式作用 把src的字串的前size個字元放到dst的位置...
面試 手寫String類
include includeclass cmystring cmystring cmystring char pdata else 當cmystring cmtest2 cmtest1 時或cmystring cmtest2 cmtest1 時呼叫 cmystring cmystring cons...