1. 旋转字符串
1.1 问题描述
给定一个字符串(以字符数组的形式)和一个偏移量,根据偏移量原地从左向右旋转字符串。
1.2 问题示例
输入str="abcdefg"
,offset=3
,输出"efgabcd"
。
输入str="abcdefg"
,offset=0
,输出"abcdefg"
。
输入str="abcdefg"
,offset=1
,输出"gabcdef"
,返回旋转后的字符串。
输入str="abcdefg"
,offset =2
,输出"fgabcde"
,返回旋转后的字符串。
提示:在 Python
中,字符串是不能进行修改的,如果要修改字符串中的字符,可以先转换成列表。
要求至少使用到 2
种以上的的解决方法。
1.3 解题思路
1.3.1 使用字符串的切片一
def rotate_str(s, offset):
if len(s) > 0:
# 如果
offset = offset % len(s)
# 使用切片
s = s[-offset:] + s[0:len(s)- offset]
return s
s = input("请输入一个字符串")
offset = int(input("请输入偏移量"))
s = rotate_str(s, offset)
print(s)
1.3.2 使用列表的 pop
和insert
方法
def rotate_str_(s, offset):
if len(s) > 0:
offset = offset % len(s)
# 转换成列表
lst = list(s)
for i in range(offset):
lst.insert(0, lst.pop())
# 返回字符串
return "".join(lst)
s = input("请输入一个字符串")
offset = int(input("请输入偏移量"))
s = rotate_str_(s, offset)
print(s)
1.3.3 使用字符串的切片二
def rotate_str_01(s, offset):
if len(s) > 0:
offset = offset % len(s)
# 原字符串扩大 2 倍
s = (s * 2)[len(s) - offset:2 * len(s) - offset]
return s
s = input("请输入一个字符串")
offset = int(input("请输入偏移量"))
s = rotate_str_01(s, offset)
print(s)
2. 相对排名
2.1 问题描述
根据N
名运动员得分,找到相对等级和获得最高分前 3
名的人,分别获得金牌、银牌和铜牌。N是正整数,并且不超过10 000。所有运动员的成绩都保证是独一无二的。
2.2 问题示例
输入运动员的得分 [5,4,3,2,1]
,输出["金牌","银牌","铜牌","4","5"]
,前3
名运动员得分较高,根据得分依次获得金牌、银牌和铜牌。对于后两名运动员,根据分数输出相对等级。
输入运动员的成绩[6,5,1,8,4,3]
,输出 ["银牌","铜牌",6,"金牌",4,5]
。
提示:输入的运动员成绩不一定刚开始就是有序的。
2.3 解题思路
#运动员的成绩
scores = [6, 5, 1, 8, 4, 3]
# 由高向低排序成绩
sort_scores = sorted(scores, reverse=True)
# 保存每一个成绩的名次
dic = {}
for i in range(len(sort_scores)):
if i == 0:
dic[sort_scores[i]] = "金牌"
elif i == 1:
dic[sort_scores[i]] = "银牌"
elif i == 2:
dic[sort_scores[i]] = "铜牌"
else:
dic[sort_scores[i]] = i + 1
res = []
for i in scores:
res.append(dic[i])
print(res)
'''
['银牌', '铜牌', 6, '金牌', 4, 5]
'''
3. 下一个更大的数
3.1 问题描述
- 两个不重复的数组
nums1
和nums2
,其中nums1
是nums2
的子集。 - 在
nums2
的相应位置找到nums1
所有元素的下一个更大数字。nums1
中的数字x
的下一个更大数字是nums2
中x
右边第1
个更大的数字。 - 如果它不存在,则为此数字输出
-1
。nums1
和nums2
中的所有数字都是唯一的,nums1
和nums2
的长度不超过1000
。
3.2 问题示例
输入nums1=[4,1,2]
,nums2=[1,3,4,2]
,输出[-1,3,-1]
。
- 对于第
1
个数组中的数字4
,在第2
个数组中找不到下一个更大的数字,因此输出-1
。 - 对于第
1
个数组中的数字1
,第2
个数组中的下一个更大数字是3
。 - 对于第
1
个数组中的数字2
,第2
个数组中没有下一个更大的数字,因此输出-1
。
提示:注意审题。
3.3 解题思路
3.3.1 使用列表的index
方法
nums1 = [4, 1, 2]
nums2 = [1, 3, 4, 2]
res = []
for i in nums1:
# 在nums1中的数字在nums2中的位置
pos = nums2.index(i)
flag = -1
# 是否存在比自己大的数字
if len(nums2)-1 >= pos + 1 is not None and nums2[pos + 1] > i:
flag = nums2[pos + 1]
res.append(flag)
print(res)
'''
输出结果
[-1, 3, -1]
'''
3.3.2 使用栈
nums1 = [4, 1, 2]
nums2 = [1, 3, 4, 2]
# 保存结果
res = {}
# 栈
stack = []
for i in nums2:
# 查找栈顶数据是否比自己小
if len(stack) > 0 and stack[-1] < i:
res[stack[-1]] = i
stack.pop()
stack.append(i)
for i in stack:
res[i] = -1
for i in nums1:
print(res[i], end=" ")
提示,也可以先把nums2
中的数字按先后顺序压入到栈中,然后提取栈顶数据,
nums1 = [4, 1, 2]
nums2 = [1, 3, 4, 2]
res = {}
stack = []
# 把nums2中的数字全部压入栈中
for i in nums2:
stack.append(i)
pre_top = None
for i in range(len(stack)):
# 提取栈顶数据
top = stack[-1]
if pre_top is not None and top < pre_top:
res[top] = pre_top
else:
res[top] = -1
pre_top = stack.pop()
for i in nums1:
print(res[i], end=" ")
4. 点积
4.1 问题描述
给出2个列表,求它们的点积。
4.2 问题示例
输入为A=[1,1,1]
和B=[2,2,2]
,输出为6
,1*2+1*2+1*2=6
。输入为A=[3,2]
和B=[2,3,3]
,输出为-1
,没有点积。
提求:至少 2
种方法实现。直接使用列表和numpy
。
4.3 解题思路
4.3.1 使用列表
a = [1, 1, 1]
b = [2, 2, 2]
res = 0
if len(a) == len(b):
for i in range(len(a)):
res += a[i] * b[i]
print(res)
4.3.2 使用 numpy
import numpy as np
a = [1, 1, 1]
b = [2, 2, 2]
res = 0
a = np.array(a)
b = np.array(b)
res = a.dot( b)
print(res)
5. 查询区间
5.1 问题描述
给定一个包含若干个区间的List
列表,长度是1000
,如[500,1500]
、[2100,3100]
。给定一个number
,判断number
是否在这些区间内,返回True
或False
。
5.2 问题示例
输入是lst=[[100,1100],[1000,2000],[5500,6500]]
和number=6000
,输出是True
,因为6000
在区间[5500,6500]
。
输入是lst=[[100,1100],[2000,3000]]
和number=3500
,输出是False
,因为3500
不在lst
的任何一个区间中。
5.3 解题思路
lst = [[100, 1100], [1000, 2000], [5500, 6500]]
number = 6000
is_exist = False
for i in lst:
if number >= min(i) and number <= max(i):
is_exist = True
break
print(is_exist)
6. 新郎和新娘
6.1 问题描述
有三对情侣结婚,假设三个新郎为A、B、C
,三个新娘为X、Y、Z
。
有参加婚礼的人搞不清谁和谁结婚,所以去询问了这六位新人中的三位,得到的回答为:
- 新郎
A
说他要和新娘X
结婚; - 新娘
X
说她的未婚夫是新郎C
; - 而新郎
C
说他要和新娘Z
结婚。 - 听到这样的回答后,提问者知道他们都是在开玩笑,说的都是假话,但他仍搞不清谁和谁结婚。
现在请编程求出到底哪位新郎和哪位新娘结婚。
6.2 解题思路
xin_lang = ["A", "B", "C"]
for x in xin_lang:
for y in xin_lang:
for z in xin_lang:
if x != xin_lang[0] and x != xin_lang[2] and z != xin_lang[2] and x != y and x != z and y != z:
print("X", x)
print("Y", y)
print("Z", z)
7. 编写求平均分的函数
7.1 问题描述
输入学生的成绩,把学生的成绩传入自定义函数,函数输出学生成绩的平均分。
提示:学生人数不限。自定义函数接收一个列表,输出平均分。
7.2 解题思路
def get_avg(lst):
s = 0
for i in lst:
s += i
return s / len(lst)
scores = []
for i in range(5):
s = int(input("请输入学生成绩"))
scores.append(s)
res = get_avg(scores)
print(res)
8.提取单词
8.1 问题描述
如有一个字符串”this is a test”请根据用户指定的单词位置,输出单词。如 用户输入 4 ,则输出 test。
提示:必须通过调用自定义函数实现效果。
8.2 解题思路
def get_word(s, pos):
lst = s.split(" ")
return lst[pos - 1]
#
s = "this is a test"
w = get_word(s, 4)
print(w)
9. 求年龄
9.1 问题描述
有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁,问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁,最后问第一个人,他说是10岁。请问第五个人多大?
9.2 解题思路
age=10
def get_age(age):
for i in range(4):
age=age+2
return age
print (get_age(age))
10. 回文数函数
10.1 问题描述
实现判断一个数是不是回文数的函数。
10.2 解题思路
def get_huiwei(num):
if str(num)[::-1] == str(num):
return True
return False
print(get_huiwei(12312))