Python基础练习题(一)

1.输入一个正整数n,对其进行因式分解并输出。

例如:输入18,输出18=2*3*3

解题思路:

①最小的质数为2,每次从2开始遍历,只要 n % i == 0 , i 为当前n的最小质数,n = n / i 作为新的正整数,跳出当前循环,再次从2开始遍历

②遍历至 n = i 时表示因式分解过程已结束

方法一:

a = int(raw_input("请输入一个整数:"))
b = ""
d = a
q = 1
print "n = %d" % a
while q:
    if a == 1:
        break
    for i in xrange(2, a+1):
        if a == i:
            q = 0
            break

        if a % i == 0 :
            b += '%s * ' % i
            a = a / i
            break

print "%s = %s%s" % (d, b, a)

方法二:

from sys import stdout
n = int(raw_input("请输入一个正整数:"))
b = n
print "n = %s" % n
stdout.write(str(n)+ " = ")
for i in range(2, n+1):
    while n != 1:
        if n % i == 0:
            n = n/i
            if n == 1:
                n = n * i
                break
            stdout.write(str(i))
            stdout.write("*")
        else:
            break

print "%d" % n

PS. print 和 sys.stdout的区别

实际上我们在调用 print (对象) 时,实际上是调用了sys.stdout(对象+'\n'),print 比sys.stdout多了一个换行符,所以在不需要换行的情况下追加字符串可以使用sys.stdout

2. 输入一行字符, 分别统计出其中英文字母、空格、数字和其它字符的个数。

解题思路:利用python的内置函数进行统计

s = raw_input("请输入一行字符串:")
letters = 0
space = 0
digit = 0
other = 0
print len(s)
for i in s:
    //判断是否为字母
    if i.isalpha():
        letters += 1
    //判断是否为空格
    elif i.isspace():
        space += 1
    //判断是否为数字
    elif i.isdigit():
        digit += 1
    else:
        other += 1

print '字母数量为%d, 空格数量为%d, 数字数量为%d, 其他数量为%d' % (letters, space, digit, other)


3.输入a和n,求s=a+aa+aaa+...na...,a表示数值,n表示数量,如a=3,n=5,则求出3+33+333+3333+33333的值

方法一:

a = int(raw_input("请输入一个数值:"))
n = int(raw_input("请输入次数:"))
sum = 0
s = ''
for i in xrange(n):
    b = int(('%d'% a) *i)
    sum += b
    s += '%s + '% str(b)

print 'sum = '+ s[:-2] + ' = %d'%sum
方法二:

Tn = 0
Sn = []
s = ''
a = int(raw_input("请输入一个数字:"))
n = int(raw_input("请输入数量:"))
for count in xrange(n):
    Tn = Tn + a
    a = a * 10
    Sn.append(Tn)
    s += '%s + ' % str(Tn)

Sn = reduce(lambda x,y: x + y, Sn)
print 'sum = %s = %d' % (s[:-2],Sn)


4.一球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下,求他在第10次落地时,共经过多少米?第10次反弹多高?

h = 100
hsum = 100
for i in xrange(1, 11):
    h = 0.5 * h
    hsum += h * 2

print hsum, h

5.一只青蛙一次可以跳上1级台阶,也可以跳上2级,求该青蛙跳上一个n级台阶总共有多少种跳法?

解题思路:青蛙一次只能跳1级或者2级台阶,那当青蛙要跳上n级台阶时,只能处于n-1台阶,或者n-2台阶这两种情况。如果用函数f(n)表示跳上n级台阶的跳法总数,那么青蛙在n-1级台阶时有f(n-1)种跳法,在n-2级台阶时有f(n-2)种跳法,由于最后跳上n级台阶只有两种跳法,那么总的跳法就是f(n) = f(n-1) + f(n-2)

其实这是一个斐波那契数列

方法一:

fib = lambda n: n if n <= 2 else fib(n-1) + fib(n-2)
fib(n)
方法二:

def fib(n):
    a = 0
    b = 1
    for _ in xrange(n):
    a, b = b, a+b
    return b
fib(n)
6.一只青蛙一次可以跳上1,2,3...n阶台阶,求该青蛙跳上一个n级的台阶有多少种方法?
解题思路:类比第5题,第五题是因为一次只能跳1或者2阶,那第n阶就是f(n) = f(n-1) + f(n-2)
现在是能跳1-n阶,则类比推出是f(n) = f(n-1) + f(n-2) + f(n-3) +...+ f(n-(n-1)) + f(n-n) = f(0) + f(1) + f(3) +...+ f(n-2) + f(n-1) = f(n-1) + f(n-1) = 2*f(n-1)

fib = lambda n: n if n <= 2 else fib(n-1) * 2
fib(n)
7.L=[1,2,3,1,2,3,2,4]要求:1.排序从大到小 2.过滤相同的数,相同的个数越多,排在前面 3.个数相同,元素从小到大排列
L = [1,2,3,1,2,3,2,4]
# 将列表转为字典
a = dict.fromkeys(L, 0)
# 对重复的数字进行遍历统计
for i in L:
    if i in a:
        a[i] += 1
L = [(k, v) for k,v in a.iteritems()]
# 利用冒泡排序对其进行排序
for i in xrange(len(L)):
    for j in xrange(len(L)-1):
        if L[j][1] < L[j+1][1]:
            L[j], L[j+1] = L[j+1], L[j]
        elif L[j][0] < L[j+1][0]:
            L[j], L[j+1] = L[j+1], L[j]
            
print L # [(2, 3), (3, 2), (1, 2), (4, 1)]
# 将结果以列表形式输出
res = [i[0] for i in L]
print res # [2, 3, 1, 4]
8.去除列表中的重复元素,L=['b', 'c', 'd', 'c', 'b', 'a', 'a']
方法一:使用set
# 使用set,set使用之后会生成新的对象,对原对象不做改变,所以需要赋值给一个新的变量
L=['b', 'c', 'd', 'c', 'b', 'a', 'a']
L2 = list(set(L))
L2.sort()
print L2 # ['a', 'b', 'c', 'd']
方法二:通过列表生成

L=['b', 'c', 'd', 'c', 'b', 'a', 'a']
L2 = []
[L2.append(x) for x in L if x not in L2]
print L2 # ['b', 'c', 'd', 'a']
方法三:通过字典生成
L=['b', 'c', 'd', 'c', 'b', 'a', 'a']
L2 = dict.fromkeys(L).keys()
print L2 # ['a', 'c', 'b', 'd']
9.合并有序列表(尾递归),L1=[1,3,5,7,9],L2=[2,4,6,8]
解题思路:因为两张表都是有序列表,每次对两表的第一个数进行比较大小,小的就添加进新的列表,并在原列表中删除,依次重复,直至有一张表为空,则另一张表剩余的数就添加至新表尾部
方法一:
def Combine(L1, L2, tmp):
    # 如果有一个列表为空,则直接将表添加进tmp尾部
    if not L1 or not L2:
        tmp.extend(L1)
        tmp.extend(L2)
        return tmp
    else:
        # 对两张表的第一个数进行比较,小的就添加进tmp,并删除列表中该数,依次重复,直至有一张表为空
        if L1[0] < L2[0]:
            tmp.append(L1[0])
            del L1[0]
        else:
            tmp.append(L2[0])
            del L2[0]
        return Combine(L1, L2, tmp)

L1 = [1, 3, 5, 7, 9]
L2 = [2, 4, 6, 8]
tmp = []
Combine(L1, L2, tmp)
print tmp # [1, 2, 3, 4, 5, 6, 7, 8, 9]
方法二:
L1 = [1, 3, 5, 7, 9]
L2 = [2, 4, 6, 8]
tmp = []

while L1 and L2:
    if L1[0] < L2[0]:
        tmp.append(L1[0])
        del L1[0]
    else:
        tmp.append((L2[0]))
        del L2[0]

tmp.extend(L1)
tmp.extend(L2)
print tmp # [1, 2, 3, 4, 5, 6, 7, 8, 9]
10.二分法查找
二分法查找就是通过不断对半的方法查找区间[a,b]内的数值位置

def binarySearch(L, t):
    x=0
    low, high = 0, len(L) - 1
    while low < high:
        mid = (low + high)/2
        if L[mid] > t:
            high = mid
        elif L[mid] < t:
            low = mid +1
        else:
            return mid

    return mid if L[mid-1] == t else False

print binarySearch([1,2,3,4,5,6,7,8,9,10], 4)














你可能感兴趣的:(Python基础)