自定义排序
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先写再根据自己掌握了的语法知识改装.
#自定义排序规则 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])
屮,好...难... 对不起先这样了,这道题花了我一个半小时......,原谅我没法继续改进了
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)
是一道思维题拉,其实这个和排序好像没啥关联(直接用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}")
模板题的改造,就是加多一个判断条件啦
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")