【问题标题】:Checking if halfs of array are palindromes检查数组的一半是否是回文
【发布时间】:2017-01-05 17:18:31
【问题描述】:

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

[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

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

【问题讨论】:

    标签: php arrays algorithm


    【解决方案1】:

    您可以通过将比较次数减半来提高 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多