面試手寫演算法題總結

2021-08-17 23:34:05 字數 3716 閱讀 2606

1.two sum問題,給定乙個陣列 nums找到陣列中兩個數之和為給定值所有或者(找到即可)組合。

暴力搜尋效率很低,這裡用類似雙指標可以讓時間複雜度達到o(n)

def 

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))

還有利用python裡的字典來解決的(這裡返回的是索引,當然也可以返回具體的值,不太明白這裡的複雜度是多少):

def 

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))

2. threesum問題: 

def 

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))

更新threesum問題:(指定乙個數,然後用兩個指標類似於二分查詢)

def 

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

3. 最長遞增子串行問題:

用貪心的思想:(從前往後,每個數做標記,當前數上的標記為前面比他小的數上最大標記+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這種所以每個字元插入『#』:

def 

func(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...