对于我的学校项目,我需要编写一个算法来检查两个数组的两半是否是回文,如果数组有奇数值,我应该在中间跳过一个。例如:
[1,2,1,6,4,2,5]应检查[1,2,1]是否为回文,如果[4,2,5]为回文,则跳过中间值会导致其奇数
这是我到目前为止写的:
$somearray = ['1','1','1','1','1','2','1','1','2','1','1'];
$array_size = count($tablica);
function check_palindrome($arr, $start, $end)
{
for($i=$start; $i < $end; $i++){
if($arr[$i] != $arr[$start+$end-$i])
{
return false;
}
}
return true;
}
if($array_size%2 == 0){
$start1 = 0;
$start2 = $array_size/2;
$end1 = $array_size/2 - 1;
$end2 = $array_size - 1;
} else {
$start1 = 0;
$start2 = round($array_size/2);
$end1 = round($array_size/2, 0, PHP_ROUND_HALF_DOWN)-1;
$end2 = $array_size -1;
}
$foo1 = check_palindrome($somearray, $start1, $end1);
$foo2 = check_palindrome($somearray, $start2, $end2);
if($foo1 && $foo2){
echo 'Halfs are palindromes';
} else {
echo 'Halfs are not palindromes';
}
它有效,但第一个最重要的部分 - 我的算法检查前半部分是回文,然后调用函数两次我检查下半部分 - 我的老师不喜欢这样并且告诉我应该把它写在一个函数中,但我真的不知道如何。
我的第二个问题是如何改进我的for循环,因为现在它检查这样的一半:
A = [1,2,4,2,1]
1 = 1,2 = 2,2 = 2,1 = 1如果为真,但在检查1 = 1和2 = 2后应该停止
由于for循环中的这个陈述,它正在发生:$ i&lt; $结束 但也不知道如何改进它:/我真的需要你的帮助。感谢。
答案 0 :(得分:0)
您可以通过将比较次数减半来提高check_palindrome
功能的效率。例如,正如它当前编写的那样,它将对3个字符的字符串执行以下操作。
check index 0 against index 3
check index 1 against index 1
check index 3 against index 0
在奇数长度的字符串中,中间字符的定义与其自身相同,因此无需检查它。当你到达左侧字符串的中间位置时,你已经检查了右侧的所有字符。
更有效的功能是:
function check_palindrome($arr, $start, $end)
{
$length = ($end - $start + 1)/2;
for($i=0; $i < length; $i++){
if($arr[$start+$i] != $arr[$end-$i])
{
return false;
}
}
return true;
}