问题描述
我正在尝试解决PHP中的FizzBuzz问题(在这种情况下,使用的是“ ApaBole”)。
从1到100计数,可被3整除的数字应输出'Apa',可被5整除的数字应输出'Bole',而被两者可整除的数字应输出'ApaBole'。所有其他数字应自行输出。
所需结果
1、2,Apa,4,Bole,Apa,7、8,Apa,Bole,11,Apa,13、14,ApaBole,16、17,Apa,19,Bole,Apa,22、23,Apa ,Bole,26,Apa,28、29,ApaBole,31、32,Apa,34,Bole,Apa,37、38,Apa,Bole,41,Apa,43、44,ApaBole,46、47,Apa,49 ,Bole,Apa,52、53,Apa,Bole,56,Apa,58、59,ApaBole,61、62,Apa,64,Bole,Apa,67、68,Apa,Bole,71,Apa,73、74 ,ApaBole,76,77,Apa,79,Bole,Apa,82,83,Apa,Bole,86,Apa,88,89,ApaBole,91,92,Apa,94,Bole,Apa,97,98,Apa ,伯乐
我的尝试
for ($i= 1; $i <= 100; $i++)
{
if($i % 15 == 0){
echo ",ApaBole";
} elseif($i % 3 == 0){
echo ",Apa";
} elseif($i % 5 == 0){
echo ",Bole";
} else{
// rtrim($i,",");
echo ','.$i;
}
}
,1、2,Apa,4,Bole,Apa,7、8,Apa,Bole,11,Apa,13、14,ApaBole,16、17,Apa,19,Bole,Apa,22、23, Apa,Bole,26,Apa,28、29,ApaBole,31、32,Apa,34,Bole,Apa,37、38,Apa,Bole,41,Apa,43、44,ApaBole,46、47,Apa, 49,Bole,Apa,52、53,Apa,Bole,56,Apa,58、59,ApaBole,61、62,Apa,64,Bole,Apa,67、68,Apa,Bole,71,Apa,73, 74,ApaBole,76、77,Apa,79,Bole,Apa,82、83,Apa,Bole,86,Apa,88、89,ApaBole,91、92,Apa,94,Bole,Apa,97、98,阿帕,伯乐%
解决方法
有几种不同的方法可以实现这一目标。正如@BadHorsie所建议的那样,一个操作是删除字符串中的第一个元素,但是如果您不在第一次迭代中,也可以在生成第一个字符串的部分中使用检查。
<?php
for ($i= 1; $i <= 100; $i++) {
if ($i % 15 == 0) {
echo ",ApaBole";
} elseif ($i % 3 == 0) {
echo ",Apa";
} elseif ($i % 5 == 0) {
echo ",Bole";
} else {
echo ($i == 1 ? '' : ',').$i;
}
}
另一种方法可能是将所有值存储在数组中,一旦拥有所有值,请使用所需的定界符implode()
将其保存。
$values = [];
for ($i= 1; $i <= 100; $i++) {
if ($i % 15 == 0) {
$values[] = "ApaBole";
} elseif ($i % 3 == 0) {
$values[] = "Apa";
} elseif ($i % 5 == 0) {
$values[] = "Bole";
} else {
$values[] = $i;
}
}
echo implode(",",$values);
另一种可能是将所有值存储在字符串变量中,然后在输出所有值之前先修剪第一个逗号。
$output = '';
for ($i= 1; $i <= 100; $i++) {
if ($i % 15 == 0) {
$output .= ",ApaBole";
} elseif ($i % 3 == 0) {
$output .= ",Apa";
} elseif ($i % 5 == 0) {
$output .= ",Bole";
} else {
$output .= ','.$i;
}
}
echo ltrim($output,',');
,
获得结果的另一种方法是将内容存储在数组中,然后implode()
:
$result = [];
for ($i= 1; $i <= 100; $i++)
{
$temp = "";
if($i % 3 == 0){
$temp = "Apa";
}
if($i % 5 == 0){
$temp .= "Bole"; // concate with previous value,} // if $i % 3 == 0 && $i % 5 == 0 then $i % 15 == 0
if ($temp == "")
{
$temp = $i;
}
$result[] = $temp;
}
echo implode(",$result);
,
问题的解决方案
我看到您实际上正在尝试解决常见的FizzBuzz面试问题,只是您的问题被称为“ ApaBole”,因为我猜这不是英语。
您可以像这样整齐地解决它:
$output = [];
for ($i = 1; $i <= 100; $i++) {
$output[] = ($i % 3 ? '' : 'Apa') . ($i % 5 ? '' : 'Bole') ?: $i;
}
echo implode(',$output);
通过将所有元素添加到数组中,可以使用implode()将所有这些元素与逗号连接在一起,而无需在字符串中添加任何前导或尾随逗号。
有关删除字符的其他说明
要回答有关PHP中常规字符串操作的问题,以下是一些指针,希望它们对您的学习有所帮助。
要摆脱字符串的第一个字符,您只需从第二个字符开始获取一个substring。
$output = substr($input,1);
但是,看起来您有一个逗号分隔的列表,您想在其中确保没有前导逗号或“空”的第一项(那里也有空格)。在这种情况下,您实际上可能想使用ltrim()来修剪字符串开头的所有逗号/空格。
$output = ltrim($input,');
如果要确保在字符串的开始或末尾没有逗号或空格,则可以改用trim()。
$output = trim($input,');
无论如何,最好改进原始代码,这样一来您就不必再有其他逗号引起了。这正是面试问题的重点-看看您是否可以适当地设计出不会留下那样混乱的解决方案。
,我认为最简单的方法是在创建像这样的字符串时删除,
:
<?php
for ($i= 1; $i <= 100; $i++)
{
if($i % 15 == 0){
echo ",ApaBole";
} elseif($i % 3 == 0){
echo ",Apa";
} elseif($i % 5 == 0){
echo ",Bole";
} else{
// rtrim($i,");
if($i == 1){
echo $i;
}else{
echo ','.$i;
}
}
}
演示:http://sandbox.onlinephpfunctions.com/code/de34ba2ec723ac96a08c1a81c1a82d8463cb1e9d
,使用数组的另一种方法:
<?php
$res = []; // create empty array
for ($i= 1; $i <= 100; $i++)
{
if($i % 15 == 0){
array_push($res,"ApaBole"); // push value into array
} elseif($i % 3 == 0){
array_push($res,"Apa"); // push value into array
} elseif($i % 5 == 0){
array_push($res,"Bole"); // push value into array
} else {
array_push($res,$i); // push value into array
}
}
echo implode(',$res); // implode array with commas
?>
另一个没有if
的紧凑代码:
<?php
$res = [];
for ($i= 1; $i <= 100; $i++)
{
array_push($res,(
$i % 15 == 0 ? "ApaBole" : (
$i % 3 == 0 ? "Apa" : (
$i % 5 == 0 ? "Bole" : $i
)
)
));
}
echo implode(',$res);
?>