1.給兩個字符串s和t,判斷t是否爲s的重新排列後組成的單詞
s=“anagram”,t=“nagaram”,return true
s=“rat”,t=“car”,return false
#排序的寫法,時間複雜度爲O(nlogn)
def isAnagram(s,t):
ss=list(s)
tt=list(t)
ss.sort()
tt.sort()
if ss==tt:
return True
else:
return False
s="anagram"
t="nagaram"
isAnagram(s,t)
s="rat"
t="car"
isAnagram(s,t)
#只要s和t中相應字母的個數相同則返回True,否則返回False
時間複雜度爲O(n)
def isAnagram(s,t):
dict1={}#{'a':1,'b':2}
dict2={}
for ch in s:
dict1[ch]=dict1.get(ch,0)+1
for ch in t:
dict2[ch]=dict2.get(ch,0)+1
if dict1==dict2:
return True
else:
return False
s="rat"
t="car"
isAnagram(s,t)
2.給定一個m*n的二維列表,查找一個數是否存在。列表有下列特性:
(1)每一行的列表從左到右已經排序好。
(2)每一行第一個數比上一行最後一個數大。
#線性查找
#時間複雜度爲O(mn)(m、n表示列表的行數和列數)
def searchMatrix(matrix,target):
for line in matrix:
if target in line:
return True
return False
matrix=[[1,3,5,7],[10,11,16,20],[23,30,34,50]]
searchMatrix(matrix,100)
#二分查找
#時間複雜度爲O(logn)(n表示二維列表的元素個數)
def searchMatrix(matrix,target):
if h==0:
return False
w=len(matrix[0])#列表的列數
if w==0:
return False
left=0
right=h*w-1
'''
0 1 2 3
4 5 6 7
8 9 10 11
h=3,w=4
中間位置的座標i=mid//4 j=mid%4
'''
while left<=right:#說明左邊有數
mid=(left+right)//2
i=mid//4
j=mid%4
if matrix[i][j]==target:
return True
elif matrix[i][j]<target:
left=mid+1
else:
right=mid-1
else:
return False
matrix=[[1,3,5,7],[10,11,16,20],[23,30,34,50]]
searchMatrix(matrix,11)
3.給定一個列表和一個整數,設計算法找到兩個數的下標,使得兩個數之和爲給定的整數。保證肯定僅有一個結果。
例如,列表[1,2,5,4]與目標整數3,1+2=3,結果爲(0,1)
def twoSum(nums,target):
n=len(nums)
for i in range(n):
for j in range(i):#和前邊的元素比較
if nums[i]+nums[j]==target:
return sorted([i,j])
li=[1,2,5,4]
twoSum(li,7)
#已知一個數,找另一個數
#利用二分查找找b,假設列表是有序的,利用二分查找
class Solution:
def binary_search(self,li,left,right,val):
while left<=right:#表明左邊有數
mid=(left+right)//2
if li[mid]==val:
return mid
elif li[mid]<val:#待查找的值在mid右側
left=mid+1
else:#待查找的值在mid左側
right=mid-1
else:
return None
def twoSum(self,nums,target):
n=len(nums)
for i in range(n):
a=nums[i]
b=target-a
if b>=a:
j=self.binary_search(nums,i+1,n-1,b)
else:
j=self.binary_search(nums,0,i-1,b)
li=[1,2,4,5]
a=Solution()
a.twoSum(li,7)
#列表是無序的
class Solution:
def binary_search(self,li,left,right,val):
while left<=right:#表明左邊有數
mid=(left+right)//2
if li[mid][0]==val:
return mid
elif li[mid][0]<val:#待查找的值在mid右側
left=mid+1
else:#待查找的值在mid左側
right=mid-1
else:
return None
def twoSum(self,nums,target):
new_nums=[[num,i] for i,num in enumerate(nums)]
new_nums.sort(key=lambda x:x[0])
n=len(new_nums)
for i in range(n):
a=new_nums[i][0]
b=target-a
if b>=a:
j=self.binary_search(new_nums,i+1,n-1,b)
else:
j=self.binary_search(new_nums,0,i-1,b)
return sorted([new_nums[i][1],new_nums[j][1]])
li=[6,3,1,7,2]
a=Solution()
a.twoSum(li,10)