哈喽,虽然我们现在彼此不认识,但是很高兴认识你 这两天我一直在认真思考这道题的解法,并且多次尝试用代码实现,不过就是卡住,用代码实现总是报错 后来发现是自己找到了递推公式 a[i]=a[i-1] + i + 1 i >= 1 a[0]=1,想直接用递推公式进行代码实现,后来苦想了两天(哭,可惜我不是那种智商贼高,一点就透的人,不仅花了两天时间,而且期间因为做不出来搞的贼痛苦。。)才发现要回到高中数学,用递推公式求通项式: a[i]=a[i-1] + i + 1 a[i]-a[i-1] = i + 1 a[i-1]-a[i-2] = i a[i-2]-a[i-3] = i - 1 . . . a[2]-a[1] = 3 a[1]-a[0] = 2 将以上式子相加得到: a[i]-a[0]= i + 1 + i + i-1 + ... + 3 + 2 因为a[0]=1,所以有: a[i] = i + 1 + i + i-1 + ... + 3 + 2 + 1 或许你和我一样模模糊糊记得高斯小时候如何计算从1到100的和那个小故事: 大约在高斯十岁的时候,老师在算数课上出了一道难题:「把1到100的整数写下来,然后把它们加起来!」高斯的答案上只有一个数字:5050 老师吃了一惊,高斯就解释他如何找到答案:1+100=101,2+99=101,3+98=101,……,49+52=101,50+51=101,一共有50对和为101的数目,所以答案是50×101=5050。 a[i] = i + 1 + i + i-1 + ... + 3 + 2 + 1 中,i + 1 后面的i + i-1 + ... + 3 + 2 + 1 就跟高斯的算法一样,有二分之一 i 对 i+1,再加上前面一个i+1(这里考虑i为奇偶数后,依然是这个结果),就是1/2i+1 对 i + 1, 那么他们的和就是(1/2i+1)* ( i + 1)= (i+2)*(i+1)/2 这样我们就得到了 a[i] =(i+2)*(i+1)/2,也就是第一行的元素的计算公式。 从而我们就能看懂评论区解法中的一种,的核心代码:res=[(e+2)*(e+1)//2 for e in range(N)],其实就是利用我们计算出的公式,来计算第一行的元素。 这个题的第一行计算出来,后面的就简单了,下一行是上一行除去第一个数以后的其它数减1,以此类推,就可以得到整个蛇形矩阵。 代码可以参考: import sys for line in sys.stdin: N=int(line.strip()) res=[] for i in range(N): if i==0: res=[(e+2)*(e+1)//2 for e in range(N)] else: res=[e-1 for e in res[1:]] # print(res) #其实到这里核心代码就结束了 for t in res: print(t,end=" ") print()
1

相关推荐

2024-12-27 13:08
华南理工大学 Java
蝴蝶飞出了潜水钟丿:多看一眼就会💥
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
2024-12-30 18:02
程序员牛肉:1.可以标记一下自己的学校是985,有一些hr可能没想到你这个院校是985的。 2.简历所呈现出来的能力还是有点差的,苍穹外卖+黑马点评。这在java技术域里面也就是刚学三四个月的样子,大厂现在招人少,小厂又更加希望你能直接过来干活。就你简历上呈现出来的能力,确实是有点难找,肉眼可见的不懂技术。 第一个项目中:简单的使用redis也算是亮点嘛?使用jwt,threadlocal也算是亮点?你不就是调了几个包嘛?Nginx作为服务器也能写出来,这不是前端的活嘛? 第二个项目中:分布式锁+mq消息队列+Lua队列。真没啥好问的。属于面试官看一眼就阳痿的简历,没有任何想提问的欲望。 我给你建议是好好的挖一挖这个项目吧,其实苍穹外卖和黑马点评这两个项目很不错了,只不过是太烂大街了导致面试官没啥问的兴趣,所以不太推荐写简历上。
点赞 评论 收藏
分享
牛客网
牛客企业服务