目录
1、成绩排序
1.1、题目描述
题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。
1.2、解题
Ⅰ思路:
主要利用嵌套列表套取用户及成绩信息和sorted函数
Ⅲ常规代码:
while True:
try:
n,sign = int(input()),int(input())
lis =[]
for i in range(n):
a,b = input().split(' ')
lis.append([a,int(b)])
if sign == 0:
res = sorted(lis,key=lambda x:x[1],reverse=True)
if sign == 1:
res = sorted(lis,key=lambda x:x[1])#默认升序
for i in lis:
print(lis[0],lis[1],sep=' ')
except:
break
2、给气球分类
1.1、题目描述
牛牛今天带来了一排气球,气球有n个,然后每一个气球里面都包含一个数字,牛牛是一个善于思考的人,于是他就想到了一个问题,
牛牛随便给你一个值K,这个值在这些气球中不一定存在,聪明的你需要把气球中包含的数字是小于K的放到这排气球的左边,大于K的放到气球的右边,
等于K的放到这排气球的中间,最终返回一个整数数组,其中只有两个值,分别是气球中包含的数字等于K的部分的左右两个下标值,如果气球中没有K这个数字就输出-1,-1。
1.2、解题
Ⅰ思路:
解题关键在于指针i,left和right初始取值值得思考,如果lis[i] > k,i不移动,直到lis[i] <= k,i进一位,目的是将大于k的值替换到i位置的右边,小于k的值替换到i位置的左边,直到i=right,此时循环替换结束。
若不存在k,i不会单独进一位,那么left=i-1=right-1,此时(left+1)>(right-1),输出'-1 -1'
若存在1个k,i一次单独进一位,那么left+1=i-1=right-1,此时(left+1)=(right-1),输出'i-1 i-1'
若存在2个k,i二次单独进一位,那么left+2=i-1=right-1,此时(left+1)+1=(right-1),输出'i-2 i-1'
注意:i为结束循环后的i,不同数组i值不一
Ⅲ常规代码:
n,k = map(int,input().split(' '))
lis = list(map(int,input().split(' ')))
left = -1
right = n
i = 0
while i < right: #假如元素均大于k,i恒等于0,right = 1时,还可循环,0位置自我替换,i=right=0,循环停止
if lis[i] > k:
lis[i],lis[right-1]=lis[right-1],lis[i]
right -= 1
elif lis[i] < k:
lis[i],lis[left+1]=lis[left+1],lis[i]
left += 1
i += 1
else: #该元素等于目标值时,跳过该元素
i += 1
if (left+1) <= (right-1):
print(left+1,right-1)
else:
print('-1 -1')
3、最短排序
3.1、题目描述
对于一个无序数组A,请设计一个算法,求出需要排序的最短子数组的长度。
给定一个整数数组A及它的大小n,请返回最短子数组的长度。
1.2、解题
Ⅰ思路:
比如一个无序数组lis = [1,5,3,4,2,6,7] 返回 4,因为只有 [5,3,4,2] 需要排序,那我们就可以分别从左往右和从右往左遍历,找出左右两边失效的位置,则这两个失效位置中间的数组即为需要排序的最短子数组。
Ⅲ常规代码:
# -*- coding:utf-8 -*-
class ShortSubsequence:
def findShortest(self, A, n):
# write code here
i = 0
k = n-1
lis_sort = sorted(A)
if A == lis_sort:
return 0
while A[i] == lis_sort[i]:
i+=1
while A[k] == lis_sort[k]:
k-=1
return k-i+1
总结
大家如果有疑问都可以评论提出,有不足之处请大家批评指正,希望能多结识这方面的朋友,共同学习、共同进步。