f=>{var s="[";for(int i=0;i<n*n-1;)s+=i%-~n<1|i++%~-n<1?i+",":"";return s+n*n+"]";}
在线尝试!
此处的更改基于要查找的数字之间的转换。从0开始的两班是n-1
和n+1
,因此,如果n=5
,对于数字n-1
会0,4,8,12,16,20
和n+1
会0,6,12,18,24
。将这些组合并给出1索引(而不是0索引)可得出1,5,7,9,13,17,19,21,25
。从偏移n
使用按位求反(按位求补操作),其中,实现~-n==n-1
和-~n==n+1
。
旧版本
f=>{var s="[";for(int i=0;i<n*n-1;i++)s+=(i/n!=i%n&&n-1-i/n!=i%n?"":i+1+",");return s+$"{n*n}]";}
在线尝试!
此方法使用列索引和行索引来确定数字是否在对角线上。i/n
给出行索引,i%n
给出列索引。
仅返回数字数组
如果仅构造数字数组被认为已计入字节成本,则可以根据Dennis.Verweij的建议(using System.Linq;
增加18个字节)执行以下操作:
C#(.NET Core),66 + 18 = 84字节
x=>Enumerable.Range(1,x*x).Where(v=>~-v%~-x<1|~-v%-~x<1).ToArray()
在线尝试!