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.接收输入数组
设输入数组为nums,长度为n。例如nums = [1, 2, 3],此时n = 3。2.复制原数组
创建一个新的切片rev,它的长度和内容与nums完全相同。
这一步是为了避免后续反转操作影响原始数组nums的内容。3.反转副本
对副本rev执行反转操作,即将rev的第一个元素与最后一个元素交换、第二个与倒数第二个交换,以此类推,直到整个数组顺序完全颠倒。
反转后,rev中的元素顺序变为原数组的逆序。
例如原数组[1, 2, 3]反转后变为[3, 2, 1]。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))。
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助力您的未来发展。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.