排序 练习题

自定义排序 

1.封闭图形个数 - 蓝桥云课

def count_closed_areas(number):
    dic = {'0': 1, '4': 1, '6': 1, '9': 1, '8': 2,'1':0,'2':0,'3':0,'5':0,'7':0}
    count = 0
    for digit in str(number):
        count += dic[digit]
    return count

# 第二种函数定义
# def count_closed_areas(number) :
#   dic = {'0': 1, '4': 1, '6': 1, '9': 1, '8': 2}
#   count = 0 
#   for digit in str(number) :
#     count += dic.get(digit , 0) # 如果当前查找的key不存在则返回第二个参数(默认值)

# 读取输入
n = int(input())
numbers = list(map(int, input().split()))

# 排序
numbers.sort(key = lambda x :[count_closed_areas(x) , x])
                 # lambda x :[count_closed_areas(x) , x] 相当于 :
                 # def f(x) :     
                 #  return [count_closed_areas(x) , x]
# 输出结果
print(' '.join(map(str, numbers))) 

注解都在代码里了......我用了一种很取巧的方法,deepseek先写再根据自己掌握了的语法知识改装.

1.数位排序 - 蓝桥云课

#自定义排序规则 step 1
def count_bit (number) :
  count = 0
  for x in str(number) :
    count += int(x)
  return count
#自定义排序规则 step 2
def sort_rule (numbers) :
  return sorted(numbers , key = lambda x : [count_bit(x) , x])

n = int(input())
#对 1 到 n 采用这种方法排序
numbers = [x for x in range(1 , n + 1)]
#排序赋值
numbers = sort_rule (numbers)
# 第m个元素
m = int(input())
# numbers 是从1到n的所以第m个数的下标是m - 1
print(numbers[m - 1])

还可以这样子进行数位运算: 

#自定义排序规则 step 1
def count_bit (number) :
  count = 0
  while number > 0 :
    count += number % 10
    number //= 10
  return count
#自定义排序规则 step 2
def sort_rule (numbers) :
  return sorted(numbers , key = lambda x : [count_bit(x) , x])

n = int(input())
#对 1 到 n 采用这种方法排序
numbers = [x for x in range(1 , n + 1)]
#排序赋值
numbers = sort_rule (numbers)
# 第m个元素
m = int(input())
print(numbers[m - 1])

 2.三国游戏 - 蓝桥云课

屮,好...难... 对不起先这样了,这道题花了我一个半小时......,原谅我没法继续改进了 

n = int(input())
A =  list(map(int,input().split()))
B =  list(map(int,input().split()))
C =  list(map(int,input().split()))
list_ = []
for i in range(n) :
  list_.append([A[i] , B[i] , C[i]])

def sort_rule(list_ , i) :
  return sorted(list_, key=lambda x: x[i] - (x[(i + 1) % 3] + x[(i + 2) % 3]), reverse=True)
  
ans = -1
for i in range(3) : 
  list_ = sort_rule(list_ , i)
  X , Y , Z = [0] * (n + 1) , [0] * (n + 1) , [0] * (n + 1) 
  for j in range(1 , n + 1) :
    X[j] = X[j - 1] + list_[j-1][0]
    Y[j] = Y[j - 1] + list_[j-1][1]
    Z[j] = Z[j - 1] + list_[j-1][2]
  for k in range(n , 0 , -1) :
    if i == 0 :
      if X[k] > Y[k] + Z[k] :
        ans = max(ans , k)
        break
    elif i == 1 :
      if Y[k] > X[k] + Z[k] :
        ans = max(ans , k)
        break
    else :
      if Z[k] > Y[k] + X[k] :
        ans = max(ans , k)
        break

 等我隔天再来修改了,我现在累得慌,实在不是什么聪明的学生哈,没天赋+前期没努力的那种,其实我也不知道做算法题对于我的就业升学有多少用处,可能是没有的,我自己也不太可能有机会走算法的,虽然自己学着coursera上的机器学习和深度学习的课程还挺有意思的''>.''.<'' ,我不知道自己在说什么,只是突然发现身边的同学都考公了,我其实觉得自己要是没技术上的天赋,要不也去考算了,考个国企什么的,但是...但是我的家庭状况(并不是那种贫穷,只是父亲把钱用在了亲戚朋友上,还有被骗了许多吧...,母亲要供一个开销很大的弟弟的学费,我其实有时候也很委屈啦,我不知道自己该怎么走,我常常觉得痛苦,并不是学习累,而是我对未来的恐惧吧,我觉得可能没有多少同学老师会看见我的博客,这是个交流技术的地方,我这样子做也挺抽象的)

好了,这道题的大致思路 : 我本来是觉得按照 X , Y , Z 其中一个从小到大排序就好了(不要问我为啥这样想,可能我觉得从小到大排序,操作的次数才能最大化吧,毕竟最后我是逆序取值次数的)...but,其实对于不等式 X > Y + Z  ->  X - Y - Z > 0 从大到小 排序sum(X - Y - Z)  

 1.错误票据 - 蓝桥云课

是一道思维题拉,其实这个和排序好像没啥关联(直接用sort()函数就行拉) 

N = int(input())
sum_list = []
for i in range(N) :
  temp = list(map(int,input().split()))
  sum_list += temp

sum_list.sort()

new_list = []
for x in sum_list :
  if x not in new_list :
    new_list.append(x)
  else :
    n = x
    sum_list.remove(x) # wayI 
    break

# sum_list = list(set(sum_list)) # wayII 想用这个方法直接吧wayI那一行注释掉就🆗了
# 注意了set序列is not subscriptable (不可下标的,就是不能用索引拉)

for i in range(1,len(sum_list)) :
  if sum_list[i] != sum_list[i - 1] + 1 :
    m = sum_list[i - 1] + 1
    break

print(f"{m} {n}")

1.排个序 - 蓝桥云课 

 模板题的改造,就是加多一个判断条件啦

n , m = map(int,input().split())
a = [0] + list(map(int,input().split()))
p = list(map(int,input().split()))

for i in range(n) :
  for j in range(1 , n - i) :
    if a[j] > a[j + 1] and j in p : #判断一下是不是在允许操作的下标中
      a[j] , a[j + 1] = a[j + 1] , a[j]

if a == sorted(a) :
  print("YES")
else :
  print("NO")

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值