华为OD机试_2025 B卷_数列描述(Python,100分)(附详细解题思路)

题目描述

有一个数列a[N] (N=60),从a[0]开始,每一项都是一个数字。数列中a[n+1]都是a[n]的描述。其中a[0]=1。规则如下:

a[0]:1
a[1]:11(含义:其前一项a[0]=1是1个1,即“11”。表示a[0]从左到右,连续出现了1次“1”)
a[2]:21(含义:其前一项a[1]=11,从左到右:是由两个1组成,即“21”。表示a[1]从左到右,连续出现了两次“1”)
a[3]:1211(含义:其前一项a[2]=21,从左到右:是由一个2和一个1组成,即“1211”。表示a[2]从左到右,连续出现了1次“2”,然后又连续出现了1次“1”)
a[4]:111221(含义:其前一项a[3]=1211,从左到右:是由一个1、一个2、两个1组成,即“111221”。表示a[3]从左到右,连续出现了1次“1”,连续出现了1次“2”,连续出现了两次“1”)
请输出这个数列的第n项结果(a[n],0≤n≤59)。

输入描述
数列的第n项(0≤n≤59)

4

输出描述
数列的内容

111221

用例

输入 4
输出 111221
说明

数列描述生成算法详解

核心解题思路

本题要求生成一个特殊的数列,其中每一项都是对前一项数字组成的描述。通过分析题目规律,我们可以发现这是一个经典的"外观数列"问题。核心思路如下:

关键观察

  1. 数列定义规则

    • a = "1" 是初始项
    • a[n+1]a[n] 的描述
    • 描述规则:统计连续相同数字的个数和该数字本身
  2. 描述示例

    • 1 → 1个1 → 11
    • 11 → 2个1 → 21
    • 21 → 1个2,1个1 → 1211
    • 1211 → 1个1,1个2,2个1 → 111221
  3. 解题策略

    • 从初始项 a = "1" 开始
    • 使用迭代方法生成后续项
    • 对每个当前项,统计连续数字的频率
    • 将频率和数字拼接成新项

完整代码实现

def generate_next(prev):
    """生成下一项描述"""
    result = []  # 存储结果的字符列表
    i = 0
    n = len(prev)
    
    # 遍历前一项字符串
    while i < n:
        # 获取当前数字
        current_char = prev[i]
        count = 0
        
        # 统计连续相同数字的数量
        while i < n and prev[i] == current_char:
            count += 1
            i += 1
            
        # 添加统计结果:数量 + 数字
        result.append(str(count))
        result.append(current_char)
    
    return ''.join(result)

def main():
    # 读取输入
    n = int(input().strip())
    
    # 初始项
    sequence = "1"
    
    # 生成数列
    for i in range(n):
        sequence = generate_next(sequence)
    
    # 输出结果
    print(sequence)

if __name__ == "__main__":
    main()

算法原理解析

1. 生成下一项的函数

def generate_next(prev):
    result = []
    i = 0
    n = len(prev)
    
    while i < n:
        current_char = prev[i]
        count = 0
        
        # 统计连续相同数字
        while i < n and prev[i] == current_char:
            count += 1
            i += 1
            
        # 添加描述
        result.append(str(count))
        result.append(current_char)
    
    return ''.join(result)
  • 双指针技术
    • 外层while循环遍历整个字符串
    • 内层while循环统计连续相同数字
  • 动态构建
    • 使用列表result逐步构建新字符串
    • 最后用join()合并为字符串
  • 时间复杂度:O(m),其中m为输入字符串长度

2. 主函数流程

n = int(input().strip())
sequence = "1"

for i in range(n):
    sequence = generate_next(sequence)

print(sequence)
  • 迭代生成
    • 从初始项"1"开始
    • 循环调用generate_next函数n次
  • 空间优化
    • 只保留当前项,不存储整个数列
    • 节省内存空间

示例解析

示例1:生成第4项(输入4)

  1. 初始状态sequence = "1"
  2. 第1次迭代
    • generate_next("1") → 统计:1个1 → "11"
  3. 第2次迭代
    • generate_next("11") → 统计:2个1 → "21"
  4. 第3次迭代
    • generate_next("21") → 统计:1个2,1个1 → "1211"
  5. 第4次迭代
    • generate_next("1211") → 统计:1个1,1个2,2个1 → "111221"
  6. 输出111221

示例2:生成第5项(输入5)

  1. 基于第4项"111221"
  2. 解析过程
    • 三个连续1:111 → 3个1 → "31"
    • 两个连续2:22 → 2个2 → "22"
    • 一个连续1:1 → 1个1 → "11"
  3. 拼接结果"31" + "22" + "11" = "312211"
  4. 输出312211

示例3:生成第6项(输入6)

  1. 基于第5项"312211"
  2. 解析过程
    • 一个3:3 → 1个3 → "13"
    • 一个1:1 → 1个1 → "11"
    • 两个2:22 → 2个2 → "22"
    • 两个1:11 → 2个1 → "21"
  3. 拼接结果"13" + "11" + "22" + "21" = "13112221"
  4. 输出13112221

数列特性分析

增长规律

项数 长度
0 1 1
1 11 2
2 21 2
3 1211 4
4 111221 6
5 312211 6
6 13112221 8
  • 长度变化:随着项数增加,长度呈近似指数增长
  • 92项长度:超过6.0×10⁹,达到宇宙原子数量级

数学特性

  1. 数字限制:只包含1,2,3三种数字
  2. 连续数字限制
    • 3不会连续出现(如33)
    • 同一数字最多连续出现3次
  3. 不变子串:从第8项起,出现"111312211312"不变子串

应用场景

1. 数据压缩

def compress(data):
    """基于描述规则的数据压缩"""
    result = []
    i = 0
    while i < len(data):
        char = data[i]
        count = 0
        while i < len(data) and data[i] == char:
            count += 1
            i += 1
        result.append(f"{count}{char}")
    return "".join(result)

2. 加密解密

def look_and_say_encode(plaintext, iterations=5):
    """多轮迭代增强安全性"""
    encoded = plaintext
    for _ in range(iterations):
        encoded = generate_next(encoded)
    return encoded

def look_and_say_decode(ciphertext, iterations=5):
    """解密需要反向操作(此处略)"""
    # 实际应用中需要设计逆向算法
    return "Decoding requires specialized algorithm"

总结与扩展

关键知识点

  1. 描述生成规则:统计连续数字频率
  2. 迭代算法:基于前项生成后项
  3. 双指针技术:高效处理连续序列
  4. 字符串处理:动态构建结果字符串

数学启示:这个看似简单的规则生成了具有深刻数学特性的序列,体现了"简单规则产生复杂行为"的混沌理论思想。约翰·康威对此序列的研究揭示了其包含92个"原子"序列和1个特殊序列的有趣特性。

你可能感兴趣的:(华为OD机试Python版,华为od,python,链表)