算法面试经典题1-3
#面试题1:判断两个字符串是否为相同字母的重新组合O(n2)
#解决办法1,直接进行1个元素1个元素的进行搜索和对比
def view(s,t):
s=list(s)
t=list(t)
r=True
r1=False
if len(s)==len(t):
for i in range(len(s)):
for j in range(len(t)):
if s[i]==t[j]:
t.remove(t[j])
r1=True
break
else:
r1=False
r=r&r1
if r:
continue
else:
break
else:
r=False
return r
print(view("anangem","naangme"))
#解决方法2,使用排序的思想,直接对字符串进行排序操作即可
def valid_anagram(s,t):
ss=list(s)
tt=list(t)
ss.sort()
tt.sort()
return ss==tt
print(valid_anagram("anangem","naangme"))
#解决方法3,使用sorted函数,直接返回一个新列表O(nlogn)
def v3(s,t):
return sorted(list(s))==sorted(list(t))
print(v3("anangem","naangme"))
#解决方法4,统计字母数目,技计数排序O(n)
def v4(s,t):
d1={}
d2={}
for ch in s:
d1[ch]=d1.get(ch,0)+1 #开始统计数目进行比较
for ch in t:
d2[ch]=d2.get(ch,0)+1
return d1==d2
print(v4("anangem","naangme"))
#面试题目2,直接在二维列表中一目标元素
#解决方法1:直接一个一个查找摸一个元素,O(mn)
def search(matrx,target):
for line in matrx:
if target in line:
return True
return False
import numpy
x=[[1,2,3],[4,5,6]]
print(x)
print(search(x,100))
#解决方法2:先对列表进行排序,再用二分查找
def search2(matrx,target):
h=len(matrx)
if h==0:
return False
w=len(matrx[0])
if w==0:
return False
left=0
right=h*w-1
while left<=right:
mid = (left + right) // 2
row = mid // w
column = mid % w
if matrx[row][column]==target:
return True
elif matrx[row][column]<target:
left=mid+1
elif matrx[row][column]>target:
right=mid-1
else:
return False
print(x)
print(search2(x,8))
#面试题3:在列表中查找两个数的和为某一输入数的两个数索引
#解决办法1:使用循环进行搜索
def cha(nums,target):
n=len(nums)
for i in range(n):
num1=target-nums[i]
m=nums[i]
nums.remove(nums[i])
if num1 in nums:
return (i,1+nums.index(num1))
else:
nums.insert(i,m)
print(cha([3,2,4],6))
#解决办法2:使用双层循环进行搜索
def cha2(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])