面试题求解:如何在循环中从单词列表生成指定前缀拼接字符串?
搞定这个逐步拼接字符串的面试题
嘿,这个面试题的逻辑其实挺清晰的,我来帮你拆解清楚,再给你写个能直接跑的PHP代码。首先咱们先把需求掰碎了看:
输入是PHP CODING TECH,要生成的输出是从每个单词取首字母拼接,然后逐步给最早还没完全输出的单词多添一个字符,直到把所有单词都完整拼起来为止。
先理清楚规律
先把输入拆成三个单词:PHP、CODING、TECH。咱们对着输出序列捋一遍:
- 第1次:每个单词取第1个字符 →
PCT - 第2次:第一个单词还没写完(原长3,现在只取了1个),给它加1个字符 →
PH+C+T=PHCT - 第3次:第一个单词再加1个字符(写完了)→
PHP+C+T=PHPCT - 第4次:第一个单词写完了,轮到第二个单词加字符 →
PHP+CO+T=PHPCOT - ...就这样,每次只给当前最早没写完的单词加一个字符,直到所有单词都完整输出,就停止。
写个能跑的PHP代码
下面是修正后的代码,我加了注释,你一看就懂:
<?php // 输入字符串 $input = "PHP CODING TECH"; // 按空格拆成单词数组 $words = explode(' ', $input); // 初始化每个单词当前要取的字符长度,第一次先取1个字符(对应第一个输出PCT) $currentLengths = array_map(function($word) { return 1; }, $words); // 用来存最终的输出序列 $resultList = []; // 循环直到所有单词都被完整输出 while (true) { $currentStr = ''; $isAllCompleted = true; // 构建当前步骤的字符串 foreach ($words as $index => $word) { $wordTotalLength = strlen($word); // 取当前单词的前N个字符(N是currentLengths里记录的长度) $currentStr .= substr($word, 0, $currentLengths[$index]); // 检查这个单词是否还没写完,只要有一个没写完,整体就没完成 if ($currentLengths[$index] < $wordTotalLength) { $isAllCompleted = false; } } // 把当前字符串加入结果列表 $resultList[] = $currentStr; // 如果所有单词都写完了,就退出循环 if ($isAllCompleted) { break; } // 找到第一个没写完的单词,给它的当前长度加1 foreach ($words as $index => $word) { if ($currentLengths[$index] < strlen($word)) { $currentLengths[$index]++; break; } } } // 打印结果,用换行分隔每个字符串 echo implode(PHP_EOL, $resultList); ?>
运行结果验证
跑这段代码,你会得到和题目要求完全一致的输出:
PCT PHCT PHPCT PHPCOT PHPCODT PHPCODIT PHPCODINT PHPCODINGT PHPCODINGTE PHPCODINGTEC PHPCODINGTECH
逻辑再梳理一遍
- 先用
explode把输入拆成单词数组,方便逐个处理。 currentLengths数组用来跟踪每个单词当前已经输出了多少个字符,初始都设为1,对应第一个输出的首字母拼接。- 每次循环先构建当前的拼接字符串,然后检查是否所有单词都已经完整输出。
- 如果还没全部完成,就找到第一个没写完的单词,把它的输出长度加1,下一次循环就会多输出一个字符。
- 直到所有单词都完整输出,就退出循环,最后把结果打印出来。
这个逻辑扩展性也很强,不管输入多少个单词,都能生成对应的逐步拼接序列。
内容的提问来源于stack exchange,提问作者Akshay Parate




