筆試 資料結構之陣列

2021-10-05 07:41:40 字數 3528 閱讀 4227

劍指offer中的陣列題目:

1)二維陣列的查詢 (會做)

在乙個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。

2)陣列中重複的數字 (會做)

在乙個長度為n的陣列裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。 例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。

3)構建乘積陣列

給定乙個陣列a[0,1,…,n-1],請構建乙個陣列b[0,1,…,n-1],其中b中的元素b[i]=a[0]a[1]…*a[i-1]a[i+1]…*a[n-1]。不能使用除法。(注意:規定b[0] = a[1] * a[2] * … * a[n-1],b[n-1] = a[0] * a[1] * … * a[n-2];)

4) 重排數列

小易有乙個長度為n的正整數數列a = 。

牛博士給小易出了乙個難題:

對數列a進行重新排列,使數列a滿足所有的a[i] * a[i + 1](1 ≤ i ≤ n - 1)都是4的倍數。

小易現在需要判斷乙個數列是否可以重排之後滿足牛博士的要求。

5)找出陣列a**現次數超過一半的數字。

對應的解題思路為:

class

solution

:# array 二維列表

deffind

(self, target, array):if

not array:

return

false

length=

len(array)

high=

len(array[0]

) i=length-

1 j=

0while i>=

0and jvalue=array[i]

[j]if value==target:

return

true

elif value>target:

i=i-

1else

: j=j+

1return

false

'''

利用資料值在0~n-1之間的特點來解題

'''

'''

題目中已經說明不能使用除法來解題,那麼就可能使用到迴圈來提高計算效率。

思路:把乘積拆分成左邊和右邊相乘

'''class

solution

:def

multiply

(self, a)

:# write code here

n=len(a)

b=[1

for i in

range

(n)]

# b[i]初始化為左邊的資料乘積

for i in

range(1

,n):

b[i]

=b[i-1]

*a[i-1]

right=

1for i in

range

(n-2,-

1,-1

):right=right*a[i+1]

b[i]

=b[i]

*right

return b

'''

分類討論,可行的排列思路為:

1. 存在 2 的倍數,所有 2 的倍數相鄰排列,需要乙個 4 的倍數連線剩下的數,奇數最多和 4 的倍數數量相等,要求 countmod4 >= countodd

2. 沒有 2 的倍數,原本放 2 的倍數一端可以改放乙個奇數,countmod4 >= countodd - 1

'''#只能被2整除的數旁邊必須是能被2或者被4整除的數

#奇數旁邊必須是能被4整除的數

t=int

(input()

)for i in

range

(t):

n=int(

input()

) alist=

list

(map

(int

,input()

.strip(

).split())

) count2=

0 count4=

0 count1=

0for value in alist:

if value%4==

0:count4=count4+

1elif value%2==

0:count2=count2+

1else

: count1+=1if

(count2>0)

&(count4>=count1)

:print

('yes'

)elif

(count2==0)

&(count4>=count1-1)

:print

('yes'

)else

:print

('no'

)

方法:設定乙個數value以及當前數的count數。初始化為當前數為陣列的第乙個數a[0],count=1,然後從第乙個數開始遍歷,遍歷的數不等於value則減1,減到0時value換成當前遍歷的數,count=1,遍歷到最後若value的count>0說明該數有可能是出現次數超過一半的數。

最後遍歷一遍確定該數的出現次數,判斷其是否大於n/2.

# -*- coding:utf-8 -*-

class

solution

:def

morethanhalfnum_solution

(self, numbers)

:# write code here

ifnot numbers:

return

0 value=numbers[0]

count=

1for i in

range(1

,len

(numbers)):

if numbers[i]

==value:

count+=

1else

: count-=

1if count<0:

value=numbers[i]

count=

1 count=

0for i in numbers:

if i == value:

count+=

1if count>

len(numbers)/2

:return value

else

:return

0

筆試題之資料結構

時間複雜度 整個演算法的執行時間與基本操作重複執行的次數成正比。參考kmp演算法,該演算法的時間複雜度為q n 通常,模式串的長度n比主串的長度m要小的多 穩定排序 排序前後,數值的相對前後位置不變的為穩定排序,否則為不穩定排序。1 簡單排序,時間複雜度o n的平方 不穩定 2 快速排序,時間複雜度...

資料結構之陣列

陣列的考點 1.二維陣列元素位址計算 三維陣列中元素個數的計算 選擇題 2.廣義表的基本概念 會求表尾 表頭,填空題 3.矩陣的壓縮儲存 壓縮儲存的目的 對稱矩陣壓縮儲存後的大小,填空題 針對考點,一一擊破。哈哈哈。第一部分 首先,二維陣列元素位址計算。注 只要知道以下三要素便可隨時求出任一元素的位...

資料結構之 陣列

陣列是線性表,就是資料排成像一條直線一樣的結構,除了陣列,鍊錶,佇列,棧都是線性結構 而非線性表就是二叉樹,堆,圖等,資料之間不是簡單的先後關係。陣列有連續的記憶體空間和相同型別的資料。正式有了這兩個限制,才有了乙個堪稱殺手鐗的特性 隨機訪問 但是刪除,插入乙個資料,為了保證連續性,就需要做大量的資...