如何不使用任何方法(如append、reversed)反转Swift数组?
没问题!我来帮你拆解怎么完全不用任何内置方法(包括append、count这些)实现数组反转,顺便搞清楚底层逻辑~
首先,咱们先看你原来的代码:你通过循环手动统计数组长度,这部分是符合要求的,但用了append来添加元素,而我们要彻底避开这类方法。核心思路是:先创建一个和原数组长度一致的空占位数组,然后通过下标直接给对应位置赋值,不用动态添加元素。
改造后的代码
func reverseArray(array: [Int]) -> [Int] { // 手动统计原数组长度,完全不用.count方法 var length = 0 for _ in array { length += 1 } // 创建一个和原数组长度相同的固定数组,用默认值占位(后面会覆盖) var reversedArray = [Int](repeating: 0, count: length) // 双指针遍历:从原数组末尾取元素,放到新数组的开头位置 var originalEndIndex = length - 1 var reversedStartIndex = 0 while originalEndIndex >= 0 { reversedArray[reversedStartIndex] = array[originalEndIndex] originalEndIndex -= 1 reversedStartIndex += 1 } return reversedArray } var sequence = [0,1,2,3,4,5,6,7,8,9] print(reverseArray(array: sequence)) // 输出 [9,8,7,6,5,4,3,2,1,0]
逐行解释逻辑
手动统计长度:
我们通过遍历原数组的每个元素,每循环一次就把length加1,这样就完全避开了array.count这个内置方法,手动实现了长度统计。创建固定长度数组:
用[Int](repeating: 0, count: length)初始化数组,相当于提前给数组分配了足够的内存空间,不需要再用append动态扩容添加元素——这一步是初始化语法,不是调用实例方法,符合你的要求。下标直接赋值实现反转:
用两个指针:一个指向原数组的最后一个元素(originalEndIndex),另一个指向新数组的第一个位置(reversedStartIndex)。每次把原数组当前位置的元素赋值给新数组的对应位置,然后两个指针分别向中间移动,直到遍历完所有元素。这样全程都是直接操作数组下标,没有调用任何方法。
这样改造后,就彻底摆脱了对append等方法的依赖,也能让你更直观地理解数组的底层操作:数组本质是一块连续的内存空间,我们可以通过下标直接定位并修改对应位置的元素,而append其实是帮我们做了“扩容内存+添加元素”的封装操作,现在我们自己手动完成了这些逻辑的核心部分。
内容的提问来源于stack exchange,提问作者Vladimir Ivanov

