版权声明: https://blog.csdn.net/qq_35122556/article/details/80394234
某天发现朋友吐槽面试碰到算法题如下:
如果输入3,打印
1 2 3
8 9 4
7 6 5
如果输入4,打印
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
求算法:
本着挑战自己的想法.既可以锻炼新学的SWIFT语法,又可以锻炼算法能力.所以没有看网上的代码实现.
直接说最终思路了.
总体思路是先分圈,如上一种颜色视为一圈.
在分组:1-8(上),9-15(右),16-22(下), 23-28左. 这个是指的上图中括号前面的数字.()里数字是求的元素在数组中的位置
每一个分组先求第一个数组中的位置.然后根据当前圈的元素位置,以此类推.
下一圈类似.
难点:
1如何判断是第几圈
2如何判断元素是那个分组
3 求每个分组的第一个元素值在arr中的位置
直接上代码:
func study() {
let n = 8;// 定义输入的数字
/*var arr = [Int](); //构造一个数组
for index in 1...(n*n) {// 数组里存入顺序输出的内容
arr.append(index)
}*/
var arr = Array(repeating:0, count:n*n) //构造一个数组 新写法
var k = 0 //圈数 如上图, 最外围算第 0 圈 红色部分为第1圈
var kx = (n - 1 - 2*k)*4 // 记录第 k 圈的元素总数
var r = 0 // 表示第n层的第几个元素
for index in 1...(n*n) {
if index <= kx {
//print("value:\(index)第\(k)层-- 第\(r)个数")
}else{//如果走else 那么 index 就是 29 49 等,圆圈的左上角第一个数
r = 0 // 需要置0
k += 1 // 圈数+1
kx += (n - 1 - 2*k)*4 //之前累计的圈的元素数
//print("value:\(index)第\(k)层-- 第\(r)个数")
}
var thisIndex = 0// 定义元素的index位置
if (r < (n - 2*k)) {//上横 (n - 2*k) 表示的是 index 7 14 21 的位置.参照图求
thisIndex = n*k + k + r //记录着 上横 数值 1-8 应该所在的 位置 以下类推(根据四个角的元素数值去类推)
}else if (r < (2*(n-2*k) - 1)) {//右竖
thisIndex = (n-1)*(k+1) + (r - (n - 2*k))*n + n
}else if(r < (3*(n-2*k) - 2)){// 下横
thisIndex = n*n - (n+1)*k - 3 - (r - (n-2*k)*2)
}else{
thisIndex = n*(n - 1) - k*(n - 1) - ( r - (3*(n-2*k) - 2) + 1)*n
}
arr[thisIndex] = index// 替换相应位置的元素
r = r + 1//元素位置+1
}
//打印输出
for (index, value) in arr.enumerated() {
if (index + 1)%n == 0 {
print("\(value) ")
}else{
print("\(value) ", terminator: "")
if value < 10 {
print(" ", terminator: "")
} else if value < 100 {
print(" ", terminator: "")
}
}
}
}