劍指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.矩陣的壓縮儲存 壓縮儲存的目的 對稱矩陣壓縮儲存後的大小,填空題 針對考點,一一擊破。哈哈哈。第一部分 首先,二維陣列元素位址計算。注 只要知道以下三要素便可隨時求出任一元素的位...
資料結構之 陣列
陣列是線性表,就是資料排成像一條直線一樣的結構,除了陣列,鍊錶,佇列,棧都是線性結構 而非線性表就是二叉樹,堆,圖等,資料之間不是簡單的先後關係。陣列有連續的記憶體空間和相同型別的資料。正式有了這兩個限制,才有了乙個堪稱殺手鐗的特性 隨機訪問 但是刪除,插入乙個資料,為了保證連續性,就需要做大量的資...