2026-08-20:连接逆序数组。用go语言,给定一个整数数组,需要生成一个新数组,长度是原来的两倍。新数组的前半部分就是把原数组从左到右原样放进去;后半部分则是把原数组从右到左逆序放进去。也就是说,先顺序复制一遍,再倒序复制一遍,最后把这两段拼接起来返回。

1 <= nums.length <= 100。

1 <= nums[i] <= 100。

输入: nums = [1,2,3]。

输出: [1,2,3,3,2,1]。

解释:

ans 的前 n 个元素与 nums 相同。

接下来的 n = 3 个元素按照 nums 的逆序填入:

ans[3] = nums[2] = 3

ans[4] = nums[1] = 2

ans[5] = nums[0] = 1

因此,ans = [1, 2, 3, 3, 2, 1]。

题目来自力扣3925。

分步骤过程描述

  1. 1.接收输入数组
    设输入数组为nums,长度为n。例如nums = [1, 2, 3],此时n = 3

  2. 2.复制原数组
    创建一个新的切片rev,它的长度和内容与nums完全相同。
    这一步是为了避免后续反转操作影响原始数组nums的内容。

  3. 3.反转副本
    对副本rev执行反转操作,即将rev的第一个元素与最后一个元素交换、第二个与倒数第二个交换,以此类推,直到整个数组顺序完全颠倒。
    反转后,rev中的元素顺序变为原数组的逆序。
    例如原数组[1, 2, 3]反转后变为[3, 2, 1]

  4. 4.拼接两个部分
    构建最终的结果数组ans

    这样,ans的前半部分就是原数组顺序,后半部分就是原数组逆序。

  • • 先将nums中的所有元素按原顺序放入ans的前n个位置。

  • • 再将已经反转的rev中的所有元素依次追加到ans的后n个位置。

5.返回结果
最终得到的ans长度为2 * n,内容为:
nums[0], nums[1], ..., nums[n-1], nums[n-1], nums[n-2], ..., nums[0]
例如输入[1, 2, 3],输出[1, 2, 3, 3, 2, 1]

复杂度分析

  • 时间复杂度
    整个过程主要包括:

    所有步骤都是线性操作,因此总时间复杂度为O(n),其中n是原数组的长度。

    • • 复制数组:需要遍历nums一次,耗时 O(n)。

    • • 反转数组:需要交换n/2对元素,同样为 O(n)。

    • • 拼接数组:将两个长度为n的数组依次放入新数组,也是 O(n)。

  • 额外空间复杂度

    因此,整个算法使用的额外空间(不含输入数组本身)为O(n)。即使只考虑辅助数组rev,额外空间也是 O(n)。

    • • 创建了辅助数组rev,长度为n,占用 O(n) 空间。

    • • 最终返回的结果数组ans长度为2n,也需要 O(n) 空间(输出数组是否计入额外空间取决于分析惯例,但无论是否计入,其数量级都是 O(n))。

Go完整代码如下:

package main

import (
"fmt"
"slices"
)

func concatWithReverse(nums []int) []int {
rev := slices.Clone(nums)
slices.Reverse(rev)
return append(nums, rev...)
}

func main() {
nums := []int{1, 2, 3}
result := concatWithReverse(nums)
fmt.Println(result)
}
打开网易新闻 查看精彩图片

Python完整代码如下:

# -*-coding:utf-8-*-

def concat_with_reverse(nums):
rev = nums[::-1]
return nums + rev

def main():
nums = [1, 2, 3]
result = concat_with_reverse(nums)
print(result)

if __name__ == "__main__":
main()
打开网易新闻 查看精彩图片

C++完整代码如下:

  




std::vector concatWithReverse(const std::vector& nums) {
std::vector rev = nums;
std::reverse(rev.begin(), rev.end());

std::vector result = nums;
result.insert(result.end(), rev.begin(), rev.end());
return result;
}

int main() {
std::vector nums = {1, 2, 3};
std::vector result = concatWithReverse(nums);

std::cout << "[";
for (size_t i = 0; i < result.size(); ++i) {
std::cout << result[i];
if (i != result.size() - 1) std::cout << " ";
}
std::cout << "]" << std::endl;

return 0;
}
打开网易新闻 查看精彩图片

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。