編程筆試題※python實現※數組類

1.尋找數組中出現次數超過一半的數(劍指offer39題)
思路1:建立一個和輸入數組一樣大小的數組,用來記錄每個數字出現的數,
最後判斷出現次數大於等於1/2len的取出來。(時間複雜度高)

l = [int(n) for n in input().split()]
#創建記錄數組
b = [None]*len(l)
for i in range(len(l)):
    b[i]=0
max=0
#對應位置的數字出現一次,記錄數組加一
for i in range(len(l)):
    for j in range(len(l)):
        if l[i]==l[j]:
            b[i]+=1
for i in range(len(l)):
    if (b[i])>=(1/2)*len(l):
        max=l[i]
print(max)

思路2:摩爾投票法,一對一消耗,留下來的數字爲衆數。(技巧)

n=len(nums)
term = nums[0]
count=0
for i in range(n):
    if nums[i]==term:
        count+=1
    else:
        count-=1
        if count==0:
            term = nums[i+1]
return term

2.一組無序的自然數集合,由0,1,2… …,n的數字和一個的數字X(X>=0 && X<=n)組成,請從集合中找出這個重複數字X。
思路:創建一個相同的數組記錄每個數字出現的次數,判斷出現次數大於1即爲所求。

l = [int(n) for n in input().split()]
#創建記錄數組
b = [None]*len(l)
for i in range(len(l)):
    b[i]=0
index=0
#出現幾,在位置爲幾的下標加1
for i in range(len(l)):
    b[l[i]]+=1
for i in range(len(l)):
    if b[i]>1:
        out=i
print(out)

3.數組中尋找第K大的數值
給定一個無序的整型數組A[n],數組大小大於等於3,允許有值相同的元素;請設計算法找到該數組排序後第三大的元素值並輸出。
例:輸入[6,5,4,4,1,2] 輸出4

ins = input()
l = list(map(int, ins[1:-1].split(',')))
l.sort()
print(l[len(l)-3])

4.連續子數組最大和
輸入一個整形數組(可能有正數和負數),求數組中連續子數組(最少有一個元素)的最大和。要求時間複雜度爲O(n)。
思路:遍歷所有以i (1≤i≤n)爲後邊界的最大子段和B[i]得出最優解:
B[i] = MAX(B[i-1]+A[i], A[i])

n = int(input(""))
A=[None]*n
for i in range(n):
    A[i]=int(input(""))
B=[None]*n
for i in range(n):
    B[i]=0
#第一個位置的數分別賦給 記錄數組B,max。
B[0]=A[0]
max=A[0]
for i in range(1, n):
    #如果之前的結果大於0,則用B[i-1]+當前位置數字  否則直接賦值當前位置數字
    if B[i-1]>=0:
        B[i]=B[i-1]+A[i]
    else:
        B[i]=A[i]
    if B[i]>max:
        max=B[i]
print(max)

5.零子數組
長度爲N的數組A中子數組和最接近0的子數組。
思路:step1:兩種可能 要麼子數組從0到j,要麼子數組從i到j。
step2:從0到j的情況,直接比較前j項累加和,取絕對值最小的。
從i到j的情況,先對前j項和累加 然後排序,計算相鄰之間的差值取最小。(相鄰說明數字接近,越接近差值越有可能爲0)

lis = [int(n) for n in input().split()]
sum = [None]*len(lis)
sum[0]=lis[0]
for i in range(1,len(lis)):
    sum[i]=sum[i-1]+lis[i]
abssum=[abs(n) for n in sum]
min1=min(abssum)
sum.sort()
for i in range(len(sum)-1):
    term=sum[i+1]-sum[i]
    if term<min1:
        min1=term
print(term)

6.連續子數組最大積
給你一個整數數組 nums ,請你找出數組中乘積最大的連續子數組(該子數組中至少包含一個數字)
思路:以0分割數組;遇到0則初始化乘積爲1.
如果數組內負數爲偶數個,則最大值爲數組內所有值乘積。
如果數組內負數爲奇數個,則最大值可能爲從前往後乘到最後一個負數之前,也可能爲從後往前乘到第一負數之後。

n=len(nums)
term = 1
max=nums[0]
for i in range(n):
    term*=nums[i]
    if term>max:  
            max=term     
    if nums[i]==0:
            term=1
term=1
i=n-1
while i>=0:
    term*=nums[i]
    if term>max:
        max=term
    if nums[i]==0:
        term=1
    i-=1
return max

7.四數之和
思路:數組先排序,固定兩個數,再用雙指針記錄低位,高位。結果比目標大,高位減一,結果比目標小,低位加一。 最後利用元組去重轉化爲列表。

nums.sort()
ans=set()  
for i in range(len(nums)-3):
     for j in range(i+1,len(nums)-2):#固定兩個數
            left=j+1#左指針
            right=len(nums)-1#右指針
            while(right>left):
                temp=nums[i]+nums[j]+nums[left]+nums[right]
                if temp==target:
                    ans.add((nums[i],nums[j],nums[left],nums[right]))
                    left+=1
                    right-=1
                if temp>target:right-=1#太大了,右指針左移
                if temp<target:left+=1#反之
#去重
rec=[]
for i in ans:
    rec.append(list(i))
return rec

8.重複的數
思路1:根據列表轉化爲數組後的長度是否有變化來判斷

if len(set(nums))==len(nums):
    return False
else:
    return True

思路2:列表記錄當前走過的數據(空間複雜度高)

l=[]
false =False
true =True
n=len(nums)
for i in range(n):
    if nums[i] not in l:
        l.append(nums[i])
    else:
        return true
    return false

9.翻轉數組
給定一個數組,將數組中的元素向右移動 k 個位置,其中 k 是非負數。
思路:先對k取餘,確保k不會大於數組長度;如果k值爲0相當於數組無變化。否爲整體變換。

k=k%len(nums)
if k==0:
    return nums
else:
    temp = nums[len(nums) - k:]      
    nums[k:] = nums[:len(nums) - k]     
    nums[:k] = temp 
    return nums

10.旋轉數組的最小數字(劍指offer第11題)
輸入一個非遞減排序的數組的一個旋轉,輸出旋轉數組的最小元素。

lis=[int(n) for n in input("").split()]
if len(lis)==0:
    print(0)
for i in range(len(lis)-1):
   if lis[i]>lis[i+1]:
        min=lis[i+1]
print(min)

11.移動0
給定一個數組 nums,編寫一個函數將所有 0 移動到數組的末尾,同時保持非零元素的相對順序。
思路1:遍歷一遍數組,如果值爲0,後面的數值整體前移一位,並記錄0出現的次數;否則繼續遍歷下一位。最後根據0出現的次數,對最後的幾位數字賦予0的值。

k=0
i=0
while i<len(nums)-k:
    if nums[i]==0:
        for j in range(i,len(nums)-1):
            nums[j]=nums[j+1]
        k+=1
    else:
        i+=1
for i in range(len(nums)-k,len(nums)):
    nums[i]=0
return nums

12.數組中重複的數字(劍指offer3題)
在一個長度爲 n 的數組 nums 裏的所有數字都在 0~n-1 的範圍內。數組中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出數組中任意一個重複的數字。
思路1:排序後 前後位置如果相同則爲重複。時間複雜度nlogn
思路2:如果數組無重複數字,排序後數字i出現在座標i中。從頭到尾掃描數字,如果數字nums[i]不在i上,則和num[nums[i]]做交換,把nums[i]放到它的位置上,知道i==nums[i],繼續遍歷。假如nums[i]==nums[nums[i]]則重複,即找到數字。

思路2代碼:
nums = [int(n) for n in input().split(" ")]
tar=0
for i in range(len(nums)):
    while nums[i]!=i:
        if nums[i]==nums[nums[i]]:
            tar=nums[i]
            break
        else:
            nums[nums[i]], nums[i]=nums[i],nums[nums[i]]
print(tar)

13.二維數組中的查找(劍指offer第4題)
在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
思路:從左下角開始查找,往右是遞增的,往上是遞減的。如果目標值小於目前值,指標上移;如果目標值大於目前值,指標右移。

n=len(array)
m=len(array[0])
i=n-1
j=0
while i>=0 and j<m:
    if array[i][j]==target:
          return True
    elif array[i][j]>target:
          i-=1
          continue
    elif array[i][j]<target:
            j+=1
            continue
return False

14.調整數組順序使奇數位於偶數前面(劍指offer21題)
輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有奇數位於數組的前半部分,所有偶數位於數組的後半部分。
思路:雙指針,前面不爲偶數則指針一直後移,後面不爲奇數則指針一直前移,然後交換兩位置的數字。 注意:控制指針越界。

nums = [int(n) for n in input().split()]
low=0
high=len(nums)-1
while low<high:
    while nums[low]%2!=0:
        low+=1
        if low==high:
            break
    if low==high:
            break
    while nums[high]%2==0:
        high-=1
        if low==high:
            break
    if low==high:
            break
    nums[low], nums[high] = nums[high], nums[low]
    low+=1
    high-=1
print(nums)

15.把數組排成最小的數(劍指offer第45題)
輸入一個非負整數數組,把數組裏所有數字拼接起來排成一個數,打印能拼接出的所有數字中最小的一個。
思路:先定義一個兩兩比較的函數,判斷哪種方式可以使得數字最小。 然後使用排序算法進行排序,只是原來比較數值大小,現在比較拼接方式大小。最後使用一個字符串依次拼接排好序的數字。

def compare(num1, num2):
    s1=str(num1)
    s2=str(num2)
    count1=int(s1+s2)
    count2=int(s2+s1)
    if count1>=count2:
        return True
    else:
        return False
def minNumber(nums):
    for i in range(len(nums)-1):
        for j in range(len(nums)-1-i):
            if self.compare(nums[j], nums[j+1]):
                nums[j], nums[j+1]= nums[j+1],nums[j]
    s=""
    for i in range(len(nums)):
        s+=str(nums[i])
    return s
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章