我有一个我无法得到的面试问题,我认为这是一个正确的问题。
问题的前提是检查两个数组是否“差不多”。
您将获得两个数组A和B,其中包含count(B) >= count(A)
。 A和B中的元素是包含字母字符的字符串,可能包含ONE SET大括号。
A = {'Hello', 'World', 'This is {cool}'}
B = {'Hello', 'World', 'This is {cool}', '{This is cool}'}
像'{This is {cool}}
这样的东西永远不会出现,因为它有两套括号。
如果符合以下情况,阵列A和B被称为“差不多”:
Hello => {Hello}
)中的元素或将A中元素中的大括号移动到元素外部来获得( This is {cool} => {This is cool}
)编写一个函数来确定两个数组A和B是否“几乎相等”。注重效率。
我写了一个函数来从A中删除一个元素,检查该元素是否出现在B中,如果该元素的任何“排列”出现在B.如果是,则从B中删除它。最后我返回如果A和B都为空,则为true。我想知道是否有更有效的解决方案。
答案 0 :(得分:2)
B包含A
中的每个元素
这可以使用array_diff
:
if (array_diff($a, $b) == array()) {
// Check #1: pass
}
从手册:
将array1与一个或多个其他数组进行比较,并返回array1中任何其他数组中不存在的值。
因此,如果$a
中的值不存在于$b
中,那么上面的检查将返回false
B中不在A中的每个元素都可以通过将大括号应用于A(
Hello
=>{Hello}
)中的元素或通过移动元素中的大括号来获得A元素的外部(This is {cool}
=>{This is cool}
)
我希望通过比较两个数组并完全删除括号来实现这一点,但规则or by moving the curly brackets within an element in A to the outside of the element
表明,如果它是围绕其他一个单词,它应该失败。
情况并非如此,但你仍然可以移除大括号并将它们放回每个字符串的边缘进行比较:
/**
* 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;
}