Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 检查两个数组是否为;几乎相等”;(一个可以转换为另一个)_Php_Arrays_Algorithm - Fatal编程技术网

Php 检查两个数组是否为;几乎相等”;(一个可以转换为另一个)

Php 检查两个数组是否为;几乎相等”;(一个可以转换为另一个),php,arrays,algorithm,Php,Arrays,Algorithm,我有一个面试的问题,我不能得到,我认为这将是正确的地方问 问题的前提是检查两个数组是否“几乎相等” 背景: 给您两个数组A和B,其中count(B)>=count(A)。A和B中的元素是包含字母字符的字符串,可能还有一组花括号 例子: 像{This is{cool}}这样的东西永远不会出现,因为它有两组大括号 如果满足以下条件,则称阵列A和B“几乎相等”: B包含A中的每个元素 B中不在A中的每个元素都可以通过将花括号应用于A中的元素(Hello=>{Hello})或将A中元素内的花括号移动到

我有一个面试的问题,我不能得到,我认为这将是正确的地方问

问题的前提是检查两个数组是否“几乎相等”

背景: 给您两个数组A和B,其中
count(B)>=count(A)
。A和B中的元素是包含字母字符的字符串,可能还有一组花括号

例子: 像
{This is{cool}}
这样的东西永远不会出现,因为它有两组大括号

如果满足以下条件,则称阵列A和B“几乎相等”:

  • B包含A中的每个元素
  • B中不在A中的每个元素都可以通过将花括号应用于A中的元素(
    Hello=>{Hello}
    )或将A中元素内的花括号移动到元素外部(
    这是{cool}=>{This is cool}
    )来获得
编写一个函数来确定两个数组a和B是否“几乎相等”。注重效率

我天真的解决方案: 我编写了一个函数来从a中删除一个元素,检查该元素是否出现在B中,以及该元素是否有任何“置换”出现在B中。如果有,则从B中删除它们。最后,如果a和B都为空,我返回true。我想知道是否有更有效的解决方案

B包含A中的每个元素

这可以通过以下方式实现:

从手册中:

将array1与一个或多个其他数组进行比较,并返回array1中不存在于任何其他数组中的值

因此,如果
$a
中存在
$b
中不存在的值,则上述检查将返回false


B中不在A中的每个元素都可以通过将花括号应用于A中的元素(
Hello
=>
{Hello}
)或将A中元素内的花括号移动到元素外部(
这是{cool}
=>
{This is cool}
)来获得

我希望通过比较两个数组并完全删除括号来实现这一点,但规则
或将A中元素中的花括号移到元素的外部
表明,如果它位于其他单词的周围,则应该失败

情况并非如此,但您仍然可以删除大括号并将其放回每个字符串的边缘以进行比较:

/**
 * Remove any braces in the value and put them back in at the edges of the string
 * @param  string $value
 * @return string
 */
function addOrMoveBraces($value)
{
    return sprintf('{%s}', str_replace(['{', '}'], '', $value));;
}

$aWithBraces = array_map('addOrMoveBraces', $a);
$bWithBraces = array_map('addOrMoveBraces', $b);

if (array_diff($bWithBraces, $aWithBraces) == array()) {
    // Check #2: pass
}

把它放在一起 您需要一个函数,因此可以执行以下操作:

/**
 * Remove any braces in the value and put them back in at the edges of the string
 * @param  string $value
 * @return string
 */
function addOrMoveBraces($value)
{
    return sprintf('{%s}', str_replace(['{', '}'], '', $value));;
}

function justAboutEqual($a, $b)
{
    // Check #1
    if (array_diff($a, $b) == array()) {
        return true;
    }

    // Check #2
    if (array_diff(array_map('addOrMoveBraces', $b), array_map('addOrMoveBraces', $a)) == array()) {
        return true;
    }

    return false;
}

与这些功能相对。

我会在这次面试中失败。我想知道他们是否只需要这个功能,所以他们推出了一个虚假的职位空缺,让求职者免费编写代码。哈哈,我想知道在整个面试过程中经常会出现这种情况
/**
 * Remove any braces in the value and put them back in at the edges of the string
 * @param  string $value
 * @return string
 */
function addOrMoveBraces($value)
{
    return sprintf('{%s}', str_replace(['{', '}'], '', $value));;
}

$aWithBraces = array_map('addOrMoveBraces', $a);
$bWithBraces = array_map('addOrMoveBraces', $b);

if (array_diff($bWithBraces, $aWithBraces) == array()) {
    // Check #2: pass
}
/**
 * Remove any braces in the value and put them back in at the edges of the string
 * @param  string $value
 * @return string
 */
function addOrMoveBraces($value)
{
    return sprintf('{%s}', str_replace(['{', '}'], '', $value));;
}

function justAboutEqual($a, $b)
{
    // Check #1
    if (array_diff($a, $b) == array()) {
        return true;
    }

    // Check #2
    if (array_diff(array_map('addOrMoveBraces', $b), array_map('addOrMoveBraces', $a)) == array()) {
        return true;
    }

    return false;
}