练习1

1 打印菱形

1.1 题目

请输入一个数字,作为菱形的上半层个数。比如输入3(n),得到一个5((n-1)*2)层的菱形。

1.2 解题思路

每层由星 “” 和空格’ ‘组成, 每一层’‘和’ ‘一共(2n +1)个,第i层有(2i+1)个’’,其它部分为’ ‘,平均分放在’‘两侧,一共int((N-2*i-1)/2)个’ '。

1.3 代码

def lingxing_1(n):
    N = 2*n - 1       
    for i in range(n):
        k = ' '*int((N-2*i-1)/2)
        x = '*'*(2*i+1)
        print(k+x+k)
    for i in range(n-2,-1,-1):
        k = ' '*int((N-2*i-1)/2)
        x = '*'*(2*i+1)
        print(k+x+k)

lingxing_1(4)

def lingxing_2(n):
    N = 2*n - 1
    a = []
    for i in range(n):
        k = ' '*int((N-2*i-1)/2)
        x = '*'*(2*i+1)
        a.append(k+x+k)
        print(k + x + k)
    for i in range(n-2,-1,-1):
        print(a[i],end='\n')

lingxing_2(4)   
           
     
          n = 4 ; N = 7
   *      i= 0  num(*)=1  num(' ')=3
  ***     i= 1  num(*)=3  num(' ')=2
 *****    i= 2  num(*)=5  num(' ')=1
*******   i= 3  num(*)=7  num(' ')=0
 *****    i= 4  num(*)=5  num(' ')=1
  ***     i= 5  num(*)=3  num(' ')=2
   *      i= 6  num(*)=1  num(' ')=3

2 喝啤酒

2.1 题目

一瓶啤酒1块钱,2个空瓶可以换一瓶啤酒,现在右20元人民币,可以换喝多少瓶啤酒?

2.2 思路

drink empty result
20 20 0
10 10 0
5 5 1
2 3 1
1 2 0
1 1

2.3 代码

def beer_1(money):
    if money == 0:
        print(0)
    else:
        drink = money        #  累计计算喝了多少啤酒
        empty = drink        #  初始空瓶换啤酒的数值,然后数值赋值给empty
        while (empty >= 2):  #  只要空瓶数量大于2,就可以继续换啤酒
            drink += empty //2
            empty = empty //2 + empty % 2
        print(drink)

def beer_2(money):
    if money == 0:
        print(0)
    else:
        print(money * 2 - 1)
    
beer_1(20)

3 奇偶分离

3.1 题目

把一个数组内的奇数放在前面,偶数放在后面。

3.2 思路

仿照快排的方法

3.3 代码

a = [1,2,3,4,5,6,7,8]
def odds_eve(li):
    n = len(li)
    tmp = li[0]
    left = 0
    right = n-1
    while(left<right):
        while(left < right and (li[right]%2 == 0)):
                right -= 1
        li[left] = li[right]
        while(left < right and (li[left]%2 != 0)):
                left += 1
        li[right] = li[left]
    li[left] = tmp

odds_eve(a)  
        
    

4 杨辉三角

4.1 题目

1        1
2       1 1
3      1 2 1
4     1 3 3 1
5    1 4 6 4 1
6  1 5 10 10 5 1

4.2 思路

  1. 先生成一个全是1的数组
  2. 如果数组的层数大于2,每行中间未知的数是上一行两个数字之和
  3. 在每一行加入空格
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1

1        1
2       1 1
3      1 2 1
4     1 3 3 1
5    1 4 6 4 1
6  1 5 10 10 5 1

4.3 代码

import numpy as np
def trangle(n):
    # 生成杨辉三角(矩形的下半部分)
    a = np.ones([n,n])
    if (n>2):
        for i in range(2,n):
            for j in range(1,i):
                a[i,j] = a[i-1,j]+ a[i-1,j-1]
    # 在每一行加入' '
    for i in range(n):
        print(' '*(n+1-i) + str(a[i,:i+1]).strip())

# Test
for i in range(n):
    trangle(i)
    print('\n')


5 青蛙跳台阶

5.1 题目

青蛙要跳n个台阶,可以一次跳一个台阶,也可以一次条两个台阶,问青蛙有多少种跳法?

5.2 思路

f(1) = 1               1                                        1
f(2) = 2               11    2                                  2
f(3) = f(1) + 2 = 3    111   12   21                            3
f(4) = f(2) + 2 = 4    1111  121  112  211  22                  5
f(5) = f(3) + 2 = 5    11111 2111 1211 1121 1112 221 212 122    8
f(6) = f(4) + 3        111111 21111 12111 11211 11121 11112 2211 2121 2112 1221 1212 1122 222   13
......
f(n) = f(n-2) + f(n-1)

5.3 代码

def f(n):
    if n <3:
        return n
    else:
        return f(n-2) + f(n-1)
        
# Test 
for i in range(1,10):
    print(f(i))

6 中位数

6.1 题目

中位数是有序序列最中间的那个数。如果序列的长度是偶数,则没有最中间的数;此时中位数是最中间的两个数的平均数。

例如:

[2,3,4],中位数是 3
[2,3],中位数是 (2 + 3) / 2 = 2.5
给你一个数组 nums,有一个长度为 k 的窗口从最左端滑动到最右端。窗口中有 k 个数,每次窗口向右移动 1 位。你的任务是找出每次窗口移动后得到的新窗口中元素的中位数,并输出由它们组成的数组。

给出 nums = [1,3,-1,-3,5,3,6,7],以及 k = 3。

窗口位置                      中位数
---------------               -----
[1  3  -1] -3  5  3  6  7       1
 1 [3  -1  -3] 5  3  6  7      -1
 1  3 [-1  -3  5] 3  6  7      -1
 1  3  -1 [-3  5  3] 6  7       3
 1  3  -1  -3 [5  3  6] 7       5
 1  3  -1  -3  5 [3  6  7]      6

6.2 思路

6.3 代码

class Solution(object):
    def medianSlidingWindow(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[float]
        """

7 字符题

7.1 判断两个字符是否相等

7.2 解题思路

s = ‘anagram’,t=‘nagaram’ ,return True
s = ‘rat’,t = ‘car’ ,return False

7.3 代码

# method1
import numpy as np
def count(x):  #  这个函数可以对keys字母排序
    a = {}
    x_ = set(x)
    for i in x_:
        a.setdefault(i,0)
    for i in x:
        a[i] += 1
    return a
    
def count1(x):  # 这个得到的字典不能排序
    a = {}
    for i in x:
        a[i] = a.setdefault(i,0) + 1
    return a

def equal(s,t):
    s1 = count(s)
    t1 = count(t)
    if len(s1)!= len(t1):
        return False
    s2 = np.array([i for i in s1.values()])
    t2 = np.array([i for i in t1.values()])
    r = s2 - t2
    if(s1.keys() == t1.keys()and sum(r)==0):
        return True
    else:
        return False

# method2
''' 1 把所有字母换成字典,每个字母对应一个数字;2 把字符转换成数字,对数字进行排序 3. 判断不同字符对应的数字是否一样,'''
# 判断两个字母是否相等
s = 'anagram'
t= 'nagaram'
def mdic(x,y):
    tmp = set(x + y )
    dic = {}
    for i, j in enumerate(tmp):
        dic[j] = i


def str2num(x,dic):
    x1 = []
    for i in x:
        x1.append(dic[i])
    return x1

def insert_sort(li):
    n = len(li)
    for i in range(1,n):
        while i>0 and li[i-1]>li[i]:
            li[i- 1],li[i] = li[i],li[i - 1]
            i = i-1
    return li

def compare(x,y):
    if len(x)!= len(y):
        return False
    x= np.array(x)
    y = np.array(y)
    if sum(x-y)==0:
        return True
    else:
        return False

def isequal(x,y):
    # 1 dict
    tmp = set(x + y)
    dic = {}
    for i, j in enumerate(tmp):
        dic[j] = i
    # 2 str2num
    x = str2num(x,dic)
    # 3 sort
    x = insert_sort(x)
    y = str2num(y,dic)
    y = insert_sort(y)
    # 4 compare
    r = compare(x,y)
    return r


# test
s = 'anagram'
t= 'nagaram' 
equal(s,t)
s = 'rat'
t = 'car'
equal(s,t)

8 频率

8.1 题目

计算频率

8.2 思路

(1) 建立字典
(2) 如果出现keys,累加一次。

8.3 代码

a=[1,1,1,2,2,3,3,2,1,1,4,4,5,2,9,5,5,6,6,6,6]
b={}
def freq(a):
	for i in a:
	    b.setdefault(i,0)  #  {1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 9: 0, 6: 0}
	    b[i]+=1

# Test
freq(a)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值