【问题标题】:string manipulation, reversion palindrome字符串操作,反转回文
【发布时间】:2012-11-02 02:46:38
【问题描述】:

让我们仅将其归类为 PHP

好的,所以我昨天接受了高级软件开发人员职位的面试。我不太记得这个问题,但我尽量写出我记得的内容。

问题;

编写一个以字符串为输入的函数,如果遍历则返回true,否则返回false。

要求; (据我所知) - 只有一种输入(字符串)类型。
- 字符串参数必须通过引用传递。
- 函数中没有变量,他的意思是如果参数被称为 $str 应该对其进行操作,不喜欢我使用第二个变量来设置 reverseStr
- 不循环字符串中的每个字符,他明确表示不要循环字符串中的每个字符。
- 没有内置的 PHP 函数可以使用,我认为他对 (strlen) 很好

我的回答;(不,他不喜欢)

$str = 'this is testing';
$length = strlen($str);
$reverseStr = '';
for($i=$length-1; $i>=0; $i--) {
 $reverseStr .= $str[$i];
}

因此,虽然这在一定程度上起到了作用,但他不喜欢我遍历每个字符来获得 reverseStr。我猜我需要考虑一个递归解决方案来获取字符串和索引等的最后一个字符。但我在写这篇文章时正在考虑这些,为时已晚!

你们在想什么?

【问题讨论】:

  • 虽然我理解它违反了规则,但请注意 PHP 有 strrev()
  • 你应该反转字符串,还是只是检查它是否是回文?函数名称暗示前者,但其内容暗示后者。
  • @MrCode 这个任务显然是为了测试受访者的算法方法。它不打算作为现实生活中的场景,而且似乎它显然完成了它的工作,因为 OP 显示了一种极端字面的方法,这并不适合高级开发人员职位。
  • 没有内置功能????这包括循环吗?
  • @Baba 循环不是函数。

标签: php lamp


【解决方案1】:

这个问题根本不清楚.. 但是如果你想检查字符串是否是回文:

function is_palindrome ($str){
    if(strlen($str)==0){return true;}
    if($str[0]==$str[strlen($str)-1]){
        return true and is_palindrome(substr($str, 1, strlen($str)-2));
    }else{
        return false;
    }
}

【讨论】:

  • strlen 在内置 PHP 函数中
  • @Baba True,但在 OP 中,他提到面试官对 strlen 的使用很好。此外,一个要求是通过引用传递$str,这个答案似乎错过了......如果解决了,将投票赞成。
  • 是的,但这是一个常见的,OP也说可以使用它。
  • 我认为我们需要设定现实的界限。除非您打算重新编写字符串操作和横向使用 strlen 所需的所有基本要素。如果这是一次采访,你会澄清一些事情。
  • 引用要求建议应该传递字符串和边界,但这与只接受一个参数的要求相冲突。是否允许可选参数 - 初始调用将使用默认值,但递归调用将传递它们。
【解决方案2】:

所以他说“不要循环遍历每个字符”,但他没有说要循环遍历其中的 一半? [邪恶的笑声]

function is_palindrome(&$str) {
    for($i = 0; $i < strlen($str) / 2; $i++) {
        if ($str[$i] != $str[strlen($str)-1-$i]) return false;
    }
    return true;
}

他说函数中没有用于操作$str 的变量,但迭代器肯定没问题吗? (嗯,除了“不循环”规则......)

is_palindrome('abcdcba'); // odd length, returns true
is_palindrome('abcddcba'); // even length, returns true
is_palindrome('abc'); // not a palindrome, returns false

我知道,我知道,这是按要求的字面意思而不是要求的精神挤压的。

【讨论】:

  • 我的第一个答案是这样的,他不喜欢我使用 for
【解决方案3】:

我认为这行得通。未经测试。虽然它确实有内部变量。

    function is_palindrome( &$str )
    {
        $i = $j = 0;
        while( isset( $str[++$j] ) ) {};

        while( $i < --$j )
        {
            if( $str[$i++] !== $str[$j] )
                return FALSE;
        }

        return TRUE;
    }

【讨论】:

  • 你测试过这个吗?我认为你应该
  • @Matt Wilson 我无法运行这个也试图了解你在 reverse() 中做了什么
  • 他说我们不想要任何额外变量的原因是因为它节省内存到目前为止,面试官说我喜欢@Naryl 对此的修复
  • 我放弃了,我试图适应一个可以工作的C版本,但是php没有它
  • @vknyvz“因为它可以节省内存,面试官说”你回答说:WTF你关心内存使用使用PHP 答案。
猜你喜欢
  • 2017-10-09
  • 2011-06-11
  • 2016-01-06
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多