检查阵列的一半是否是回文

时间:2017-01-05 17:18:32

标签: php arrays algorithm

对于我的学校项目,我需要编写一个算法来检查两个数组的两半是否是回文,如果数组有奇数值,我应该在中间跳过一个。例如:

[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; $结束 但也不知道如何改进它:/

我真的需要你的帮助。感谢。

1 个答案:

答案 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;
}