算法题汇总

1、快速排序

2、IP的有效值是1.0.0.1~255.255.255.255,写个程序参数是char*的IP,返
回IP是否合法
提示:IP不超过4位,是否每一位都在合法范围,是否包含非法字符

3、一个字符串数组char*A[]={'china','chinese',chese',...},求这个数
组中字符串的最长公共前缀

4、求两个字符串的最大公共子串,例:‘abcdefg’和 ‘zxdef’最长公共
子串为‘def’

def find_lcsubstr(s1, s2):
  m = [[ 0 for i in range ( len (s2) + 1 )] for j in range ( len (s1) + 1 )] #生成0矩阵,为方便后续计算,比字符串长度多了一列
  mmax = 0  #最长匹配的长度
  p = 0 #最长匹配对应在s1中的最后一位
  for i in range ( len (s1)):
  for j in range ( len (s2)):
   if s1[i] = = s2[j]:
   m[i + 1 ][j + 1 ] = m[i][j] + 1
   if m[i + 1 ][j + 1 ]>mmax:
    mmax = m[i + 1 ][j + 1 ]
    p = i + 1
  return s1[p - mmax:p],mmax  #返回最长子串及其长度   
print find_lcsubstr( 'abcdfg' , 'abdfg' )
 
 
 
#最长公共序列
import numpy
def find_lcseque(s1, s2):
  # 生成字符串长度加1的0矩阵,m用来保存对应位置匹配的结果
  m = [ [ 0 for x in range ( len (s2) + 1 ) ] for y in range ( len (s1) + 1 ) ]
  # d用来记录转移方向
  d = [ [ None for x in range ( len (s2) + 1 ) ] for y in range ( len (s1) + 1 ) ]   
  for p1 in range ( len (s1)):
  for p2 in range ( len (s2)):
   if s1[p1] = = s2[p2]:      #字符匹配成功,则该位置的值为左上方的值加1
   m[p1 + 1 ][p2 + 1 ] = m[p1][p2] + 1
   d[p1 + 1 ][p2 + 1 ] = 'ok'    
   elif m[p1 + 1 ][p2] > m[p1][p2 + 1 ]: #左值大于上值,则该位置的值为左值,并标记回溯时的方向
   m[p1 + 1 ][p2 + 1 ] = m[p1 + 1 ][p2]
   d[p1 + 1 ][p2 + 1 ] = 'left'    
   else :              #上值大于左值,则该位置的值为上值,并标记方向up
   m[p1 + 1 ][p2 + 1 ] = m[p1][p2 + 1
   d[p1 + 1 ][p2 + 1 ] = 'up'    
  (p1, p2) = ( len (s1), len (s2))
  print numpy.array(d)
  s = []
  while m[p1][p2]:  #不为None时
  c = d[p1][p2]
  if c = = 'ok' #匹配成功,插入该字符,并向左上角找下一个
   s.append(s1[p1 - 1 ])
   p1 - = 1
   p2 - = 1
  if c = = 'left' : #根据标记,向左找下一个
   p2 - = 1
  if c = = 'up' #根据标记,向上找下一个
   p1 - = 1
  s.reverse()
  return ''.join(s)
print find_lcseque( 'abdfg' , 'abcdfg' )
 

5、单向链表反序

6、多个已序数组交集

7、遍历二叉树

8、对一篇文章中的单词按字母顺序排序

9、找出字符串里第一个重复出现的字符‘afdgdfdadfg’

10、对一个版本的字符串比较大小:1.2.2,1.0.1,1.3.2,排序

11、字符串‘welcom to tidn&di’,编码输出其中的‘tidndi’

第一种方法:

 t='welcome to tidn&di'

r='tidndi'

e=t[11:]

w=e.replace('&','')
print(w)

第二种方法:

w=t[11:15]+t[16:] 

print(w)

 

#冒泡排序
def sot(x):
for i in range(len(x)-1):
for j in range(len(x)-1-i):
if x[j]>x[j+1]:
x[j],x[j+1]=x[j+1],x[j]
return x

#选择排序
def sot(x):
for i in range(len(x)):
min=i
for j in range(i+1,len(x)):
if x[i]>x[j]:
min=j
t = x[min]
x[min] = x[i]
x[i] = t


#插入排序
def sot(x):
for i in range(1,len(x)):
j=i-1
while j>=0:
if x[j]>x[j+1]:
x[j],x[j+1]=x[j+1],x[j]
j=j-1
else:
break
return x

 
#快速排序(待确定)
def sot(x):
for i in range(1,len(x)):
key=x[i]
j=i-1
while j>=0:
if x[j]>key:
x[j+1]=x[j]
x[j]=key
j=j-1
else:
break
return x

#快速排序
def partion(nums,left,right):
key = nums[left]
while left < right:
# right下标位置开始,向左边遍历,查找不大于基准数的元素
while left < right and nums[right] >= key:
right -= 1
if left < right: # 找到小于准基数key的元素,然后交换nums[left],nums[right]
nums[left],nums[right] = nums[right],nums[left]
else: # left〉=right 跳出循环
break
# left下标位置开始,向右边遍历,查找不小于基准数的元素
while left < right and nums[left] < key:
left += 1
if left < right: # 找到比基准数大的元素,然后交换nums[left],nums[right]
nums[right],nums[left] = nums[left],nums[right]
else: # left〉=right 跳出循环
break
return left #此时left==right 所以返回right也是可以的
def quick_sort_standord(nums,left,right):
if left < right:
key_index = partion(nums,left,right)
quick_sort_standord(nums,left,key_index)
quick_sort_standord(nums,key_index+1,right)
if __name__ == '__main__':
nums = [5, 6, 4, 2, 3,1]
print nums
quick_sort_standord(nums,0,len(nums)-1)
print nums
 



转载于:https://www.cnblogs.com/jiaoxiaohui/p/10640465.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值