构造特定数组的逆序拼接 | 豆包MarsCode AI刷题

119 阅读3分钟

构造特定数组的逆序拼接 | 豆包MarsCode AI刷题

摘要

本文介绍了如何根据给定的数字 nn 构造一个特定的逆序拼接数组。通过数学公式和双重计数的方式,逐步填充数组,最终输出符合要求的结果。本文包含详细的算法分析、代码实现和测试用例。

问题描述

小U得到了一个数字 nn,他的任务是构造一个特定数组。构造规则为:对于每个 ii 从 1 到 nn,将数字 nnii 逆序拼接,直到 ii 等于 nn 为止。最终,输出这个拼接后的数组。

例子

  • 输入:n=3n = 3
    输出:[3,2,1,3,2,3][3, 2, 1, 3, 2, 3]

  • 输入:n=4n = 4
    输出:[4,3,2,1,4,3,2,4,3,4][4, 3, 2, 1, 4, 3, 2, 4, 3, 4]

  • 输入:n=5n = 5
    输出:[5,4,3,2,1,5,4,3,2,5,4,3,5,4,5][5, 4, 3, 2, 1, 5, 4, 3, 2, 5, 4, 3, 5, 4, 5]

原理分析

1. 数学基础

利用等差数列求和公式 nums:=(1+n)n2nums := \frac{(1+n) \cdot n}{2} 计算结果数组的长度。

2. 双重计数

使用两个计数器 c1c1c2c2

  • c1c1:表示当前从 nn 开始逆序拼接到的数字。
  • c2c2:表示当前逆序拼接的结束点。

3. 迭代构造数组

在主循环中,通过循环和计数器填充数组 ansans

  • 通过 ans[i]=nc1ans[i] = n - c1 将数字逆序添加到数组中。
  • c1c1 达到 c2c2 时,重置 c1c1 并将 c2c2 减少 1,以准备下一个拼接。

4. 逻辑流

程序流程为:

  1. 计算结果数组的大小。
  2. 创建一个长度为 numsnums 的数组 ansans
  3. 使用循环和计数器填充数组,确保按照从 nnii 的逆序顺序。

示例

n=3n = 3 为例:

  • 计算 numsnums66(从 1133 的和)。
  • 初始化 ansans 数组为长度为 66 的切片。
  • 循环过程:
    • i=1i = 1,填充 [3,2,1][3, 2, 1],然后继续。
    • i=2i = 2,填充 [3,2][3, 2],然后继续。
    • i=3i = 3,填充 [3][3],结束。

最终得到的数组为 [3,2,1,3,2,3][3, 2, 1, 3, 2, 3]

代码实现

Go语言代码

package main

import (
	"fmt"
	"reflect"
)

func solution(n int) []int {
	// write code here
	nums := (1 + n) * n / 2
	ans := make([]int, nums)
	c1 := 0
	c2 := n
	for i := 0; i < nums; i++ {
		ans[i] = n - c1
		c1++
		if c1 == c2 {
			c1 = 0
			c2--
		}
	}
	return ans
}

func main() {
	fmt.Println(reflect.DeepEqual(solution(3), []int{3, 2, 1, 3, 2, 3}))
	fmt.Println(reflect.DeepEqual(solution(4), []int{4, 3, 2, 1, 4, 3, 2, 4, 3, 4}))
	fmt.Println(reflect.DeepEqual(solution(5), []int{5, 4, 3, 2, 1, 5, 4, 3, 2, 5, 4, 3, 5, 4, 5}))
}

Python代码

def solution(n):
    """
    该函数接受一个整数 n,生成一个列表,其中包含 n 的所有整数,按照特定的模式重复。
    列表的长度为 (1+n)*n/2。
    """
    nums = (1 + n) * n // 2  # 计算列表的总长度
    ans = [0] * nums  # 创建一个长度为 nums 的列表,初始化为 0
    c1 = 0  # 第一个计数器,表示当前填充的元素
    c2 = n  # 第二个计数器,表示剩余的不同数字

    for i in range(nums):
        ans[i] = n - c1  # 填充当前元素为 n - c1
        c1 += 1  # 增加 c1

        if c1 == c2:  # 如果 c1 达到 c2 的值
            c1 = 0  # 重置 c1
            c2 -= 1  # 减少 c2,以减少可用的数字

    return ans  # 返回生成的列表


if __name__ == "__main__":
    # 添加测试用例
    print(solution(3) == [3, 2, 1, 3, 2, 3])  # 应输出 true
    print(solution(4) == [4, 3, 2, 1, 4, 3, 2, 4, 3, 4])  # 应输出 true
    print(solution(5) == [5, 4, 3, 2, 1, 5, 4, 3, 2, 5, 4, 3, 5, 4, 5])  # 应输出 true