leetcode
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的数组
- 如果数组的层数大于2,每行中间未知的数是上一行两个数字之和
- 在每一行加入空格
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)