题目一:二分查找
二分查找简介:
二分查找又叫折半查找,二分查找应该属于减治技术的成功应用。所谓减治法,就是将原问题分解成若干个子问题后,利用了规模为n的原问题的解与较小规模(通常是n/2)的子问题的解之间的关系。
二分查找利用了记录按关键码有序的特点,其基本思想为:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键码相等,则查找成功;若给定值小于中间记录的关键码,则在中间记录的左半边继续查找;若给定值大于中间记录的关键码,则在中间记录右半边区继续查找。不断重复上述过程,直到查找成功,或所查找的区域无记录,查找失败。
二分查找的时间复杂度是O(log(n)),最坏情况下的时间复杂度是O(n)。
# coding:utf-8
import sys
def search2(a,m):
low = 0
high = len(a)-1
while(low<=high):
mid = (low+high)/2
midval = a[mid]
if midval<m:
low = mid+1
elif midval>m:
high = mid-1
else:
print mid
return mid
print -1
return -1
if __name__=="__main__":
a = [int(i) for i in list(sys.argv[1])]
m = int(sys.argv[2])
search2(a, m)
题目二:插入排序
描述:插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
#插入排序
def insert_sort(lists):
#插入排序
count = len(lists)
for i in range(1,count):
key = lists[i]
j = i - 1
while j >=0:
if lists[j] > key:
lists[j+1] = lists[j]
lists[j] = key
j = j - 1
return lists
题目三:汉诺塔
汉诺塔简介:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
#汉诺塔
def move(n,a,b,c):
if n ==1:
print a,'---->',c
else:
move(n-1,a,c,b)#将前n-1个盘子从a移动到b
move(1, a, b, c)#将最底下的最后一个盘子从a移动到c
move(n-1, b, a,c)#将b上的n-1个盘子移动到c上
move(3,'A','B','C')
题目四:杨辉三角
杨辉三角简介
杨辉三角有以下几个特点:
- 每一项的值等于他左上角的数和右上角的数的和,如果左上角或者右上角没有数字,就按0计算.
- 第N层项数总比N-1层多1个
- 计算第N层的杨辉三角,必须知道N-1层的数字,然后将相邻2项的数字相加,就能得到下一层除了最边上2个1的所有数字。
听起来有点像递归的思想,我们不妨假设我们已经知道N-1层的数字,来计算一下N层的数字吧。
#杨辉三角
def _yanghui_trangle(n,result):
if n == 1:
return [1]
else:
return [sum(i) for i in zip([0]+result,result=[0])]
题目五:python 打印菱形、三角形、矩形
#杨辉三角
def _yanghui_trangle(n,result):
if n == 1:
return [1]
else:
return [sum(i) for i in zip([0]+result,result=[0])]
rows = int(raw_input('输入列数:'))
i = j = k =1 #声明变量,i用于控制外层循环(图形行数),j用于控制空格的个数,k用于控制*的个数
#等腰直角三角形
print "等腰直角三角形1"
for i in range(0,raws):
for k in range(0,rows-i):
print " * ",#这里不进行换行,所以加上逗号
k = k + 1
i = i + 1
print "\n"
#打印实心等边三角形
print "打印空心等边三角形,这里去掉if-else条件判断就是实心的"
for i in range(0,rows+1):#变量i控制行数、
for j in range(0,rows-i):#(1,rows-i)
print " ",
j = j + 1
for k in range(0,2*i-1):#(1,2*i)
if k == 0 or k == 2*i-2 or i == rows:
if i == rows:
if k % 2 == 0:#因为第一个数是从0开始的,所以要是偶数打印*,奇数打印空格
print "*"
else:
print " ",#保留逗号不换行
else:
print "*"
else:
print " ",
k = k + 1
print "\n"
i = i + 1
#打印菱形
print "打印空心等菱形,这里去掉if-else条件判断就是实心的"
for i in range(rows):#变量i控制行数
for j in range(rows-i):#(1,rows-i)
print " ",
j = j + 1
for k in range(2*i-1):#(1,2*i)
if k == 0 or k ==2*i-2:
print "*",
else:
print " ",
k = k + 1
print "\n"
i = i + 1
#菱形的下半部分
for i in range(rows):
for j in range(i):#1,rows-i)
print " ",
j = j + 1
for k in range(2*(rows-i)-i):#(1,2*i)
if k == 0 or k == 2*(rows-i)-2:
print "*",
else:
print " ",
k = k + 1
print "\n"
i = i + 1
#实心正方形
print "实心正方形"
for i in range(0,rows):
for k in range(0,rows):
print " * ",
k = k + 1
i = i + 1
print "\n"
#空心正方形
print "空心正方形"
for i in range(0,rows):
for k in range(0,rows):
if i != 0 and i != rows - 1:
if k == 0 or k == rows - 1:
#由于视觉效果看起来更像正方形,所以这里*两侧加了空格,增大距离
print " * ",#不换行
else:
print " ",#三个空格
else:
print " * ",
k = k + 1
i = i + 1
print "\n"
题目六:Python将人民币转换大写
def Num2MoneyFormat(change_number):
"""
.转换数字为大写货币格式(format_word.__len__()-3+2位小数)
change_number 支持float,int,long,string
"""
format_word = ["分","角","元",
"拾","百","千","万",
"拾","百","千","亿",
"拾","百","千","万",
"拾","百","千","兆",
]
format_num = ["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"]
if type(change_number) == str:
#-如果是字符串,先尝试转换成float或者int
if '.' in change_number:
try:
change_number = float(change_number)
except:
raise ValueError,'%s can\'t change '%change_number
else:
try:
change_number = int(change_number)
except:
raise ValueError,'%s can\'t change'%change_number
if type(change_number) == float:
real_numbers = []
for i in range(len(format_word)-3,-3,-1):
if change_number >= 10 ** i or i<1:
real_numbers.append(int(round(change_number/(10**i),2)%10))
elif isinstance(change_number,(int,long)):
real_numbers = [int(i) for i in str(change_number)+'00']
else:
raise ValueError,'%s can\'t change'%change_number
zflag = 0#标记连续0次数,已删除万字,或适时插入零字
start = len(real_numbers)-3
change_words = []
for i in range(start, -3,-1):#使i对应实际位数,负数为角分
if 0 != real_numbers[start-i] or len(change_words) == 0:
if zflag:
change_words.append(format_num[0])
zflag = 0
change_words.append(format_num[real_numbers[start-i]])
change_words.append(format_word[i+2])
elif 0 == i or (0 == i%4 and zflag <3):#控制万/元
change_words.append(format_word[i+2])
zflag = 0
else:
zflag = zflag + 1
if change_words[-1] not in (format_word[0],format_word[1]):
#-最后两位非“角”、“分”,则补“整”
change_words.append("整")
return ''.join(change_words)
题目七:文件合并
#有两个磁盘文件A和B,个存放一行字母,要求吧这两个文件中的信息合并(按照字母顺序排列),
#输出到一个新文件C中
if __name__=="__main__":
import string
fp = open('A.py')
a = fp.read()
fp.close()
fp = open('B.py')
b = fp.read()
fp.close()
fp = open('C.txt','w')
l = list(a+b)
l.sort()
s = ''
fp.write(s)
fp.close()