You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

冰雹序列递归程序问题:startNum函数返回错误最长序列起始数

修复冰雹序列startNum(int n)函数:返回1至n中最长序列的起始数字

嘿,我懂你现在的困扰——你的冰雹序列程序已经能正确输出序列长度、最大值和1到n内的最长序列长度,但偏偏startNum(int n)函数掉链子,比如1到16的范围里本该返回9,结果给了错误值。别担心,咱们来捋捋这个函数常见的问题点,然后把它修好。

常见错误原因

大概率是startNum函数里的遍历比较逻辑出了问题,比如:

  • 只更新了最长序列长度,却忘了同步更新对应的起始数字;
  • 比较条件写错(比如用了<=而不是>),导致本该替换的时候没替换;
  • 初始化值设置错误(比如把最长长度初始成0,而不是1的序列长度)。

修复后的函数逻辑

核心思路就是:遍历1到n的每个数字,记录当前遇到的最长序列长度和对应的起始数字,遇到更长的序列就更新这两个值。如果遇到多个数字序列长度相同,根据需求决定返回最小还是最大的起始数(通常题目默认返回最小的,所以不用额外处理,因为先遍历到小的,后面相同长度不会覆盖)。

示例代码(以Java为例)

假设你已经有一个正确的hailstoneLength(int num)函数用来计算单个数字的冰雹序列长度,那startNum可以这么写:

public static int startNum(int n) {
    // 处理非法输入
    if (n < 1) {
        return -1;
    }
    // 初始化:从数字1开始,它的序列长度是1
    int maxSeqLength = hailstoneLength(1);
    int longestStart = 1;

    // 从2开始遍历到n
    for (int i = 2; i <= n; i++) {
        int currentLen = hailstoneLength(i);
        // 只有当当前序列长度大于已记录的最长长度时,才更新
        if (currentLen > maxSeqLength) {
            maxSeqLength = currentLen;
            longestStart = i;
        }
        // 如果要求多个相同最长长度时返回最大的起始数,把上面的>改成>=即可
    }

    return longestStart;
}

验证1-16的情况

咱们手动核对下:数字9的冰雹序列长度是20,而1到16里其他数字的序列长度都比它短(比如14和15是18,11是15),所以这个函数会正确返回9。

额外注意点

  • 确保hailstoneLength函数的计数是正确的(比如包含起始数字本身,1的序列长度是1而不是0);
  • 如果需要优化性能,可以用记忆化缓存来存储已经计算过的数字的序列长度,避免重复计算(不过这是进阶优化,不影响正确性)。

内容的提问来源于stack exchange,提问作者smith

火山引擎 最新活动