You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP级联文本函数cascade开发问题:输出不符合预期

修正cascade函数实现

你的当前代码逻辑错误,它将每个单词的字符单独纵向输出后拼接,而实际需要把所有单词的对应行字符按指定间隔对齐,共同组成每一行。以下是修正后的代码:

function cascade(string $s, int $gap): string {
    $words = explode(' ', $s);
    $lines = [];
    
    // 计算每个单词的起始列位置
    $startPositions = [];
    $currentStart = 0;
    foreach ($words as $word) {
        $startPositions[] = $currentStart;
        $currentStart += 1 + $gap; // 字符占1位 + 指定间隔
    }
    
    // 找到最长单词的长度,确定总行数
    $maxWordLength = max(array_map('strlen', $words));
    // 计算每行的总长度(最后一个单词的最后一个字符的位置 +1)
    $lineLength = $startPositions[array_key_last($startPositions)] + $maxWordLength;
    
    // 构建每一行
    for ($lineNum = 0; $lineNum < $maxWordLength; $lineNum++) {
        // 初始化当前行为全下划线
        $currentLine = array_fill(0, $lineLength, '_');
        
        foreach ($words as $wordIndex => $word) {
            // 如果当前单词有对应行的字符
            if ($lineNum < strlen($word)) {
                $charPosition = $startPositions[$wordIndex] + $lineNum;
                $currentLine[$charPosition] = $word[$lineNum];
            }
        }
        
        // 拼接成字符串并加入结果
        $lines[] = implode('', $currentLine);
    }
    
    return implode(PHP_EOL, $lines);
}

代码逻辑说明

  1. 计算单词起始位置:遍历所有单词,确定每个单词的第一个字符在第一行的起始列,后续每个单词的起始位置 = 前一个单词起始位置 + 1(字符占位) + 指定间隔gap。
  2. 确定总行数和行长度:总行数由最长单词的长度决定;每行的总长度是最后一个单词的最后一个字符的位置(起始位置 + 最长单词长度 -1)加1,确保能容纳所有字符和下划线。
  3. 逐行构建内容:
    • 先将当前行填充为全下划线;
    • 遍历每个单词,如果当前行号在单词的字符范围内,就将对应字符放到计算好的位置上;
    • 拼接字符数组为字符串,加入结果集合。

测试示例1:cascade("The codings bug", 2),输出与预期一致:

T__c__b___
_h__o__u__
__e__d__g_
______i___
_______n__
________g_
_________s

测试示例2:cascade("The coding bug", 3),输出与预期一致:

T___c___b__
_h___o___u_
__e___d___g
_______i___
________n__
_________g_

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 23:36:06