检查是否可以使用2个元素的单个交换对数组进行排序

Abb*_*asi 5 php arrays sorting

我正在尝试编写一个函数来检查数组是否可以使用数组中的值的单个交换进行排序.

例如:array(1,3,5,3,7)必须返回true,但array(1,3,5,3,4)必须返回false.

我在下面尝试了以下代码,但我坚持下去:

$noOfIterations = 0;

for($x = 0; $x < count($a)-2; $x++) {

    if($a[$x] > $a[$x+1]) {
        $noOfIterations ++;
    }

}

return $noOfIterations >1; 

// The below solution helped as well.

//$arr = [1, 3, 5, 3, 7];  //[1, 3, 5, 3, 4]
$arr = [1, 3, 5, 3, 4];
$sortedArr = $arr;
sort($sortedArr);
print_r(array_intersect_assoc($arr,$sortedArr));
Run Code Online (Sandbox Code Playgroud)

Riz*_*123 6

这应该适合你:

(这里我首先制作原始数组的副本然后sort()它.之后我遍历两个数组array_map()并查看有多少位置已经改变.array_filter()我将元素排序到没有位置改变的地方.然后你可以简单地检查是否2或更多位置已更改并打印为FALSE或TRUE)

<?php

    $arr = [1, 3, 5, 3, 7];  //[1, 3, 5, 3, 4]
    $sortedArr = $arr;
    sort($sortedArr);

    $filtered = array_filter(
        array_map(function($v1, $v2){
            return ($v1 == $v2 ?FALSE:TRUE);
        }, $arr, $sortedArr)
    );

    var_dump(count($filtered) > 2 ? FALSE : TRUE);

?>
Run Code Online (Sandbox Code Playgroud)

输出:

TRUE  //FALSE
Run Code Online (Sandbox Code Playgroud)

  • 你应该接受这个答案@WajidAbbasi,因为它是最正确的,并有详细的解释. (2认同)

Mar*_*ker 3

执行排序,然后使用array_intersect_assoc()将原始数组与排序后的数组进行比较...如果差异超过两个元素,则答案为“否”