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

时间:2015-04-23 00:11:39

标签: 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));

5 个答案:

答案 0 :(得分: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);

?>

输出:

TRUE  //FALSE

答案 1 :(得分:3)

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

答案 2 :(得分:1)

如果你真的想用循环来做,你可以用双循环来比较每个值。你需要通过比较获得一些创意。从我看到的,你的代码在第一个数组上成功但在第二个数组上失败。它在第二个上失败,因为你只检查2个相邻的条目而3个总是小于4.或者你可以跟踪最大的数字并计算多少个数字小于它的值。如果遇到其他更大的值,也要确保添加到计数中。希望这一切都有道理。

答案 3 :(得分:0)

如果数组已排序且不需要交换怎么办?

如果我知道为什么会有所帮助。

试试这个,它适用于你的两个示例数组。

function swap($array){
  $prev = 0;
  $count = 0;
  foreach($array as $val){
    if($val < $prev){
       $count++;
    }
    else{
      $prev = $val;
    }
  }
  if($count < 2){return(true);}else{return(false);}
}

答案 4 :(得分:0)

我在php中的回答。

function oneSwap($A){

  $count=count($A);
  $swaps=0;
  $curr_max = 0;
  $res = false;
  for($i = 0; $i <= $count; $i++) {
    if(isset($A[$i+1])){
      if(($A[$i] >= $A[$i + 1]) && $curr_max >= $A[$i+1]){
        $swaps++;
      }

      if($A[$i] >= $A[$i +1]){
          $curr_max = $A[$i];
      }
    }

  }

  if(($swaps == 1) || ($swaps == 0 && $curr_max ==0)){
    $res = true;
    echo $res;
  } 
} 

oneSwap([3,1,2,8]);
oneSwap([1,2,3]);
oneSwap([1,5,3,3,7]);
oneSwap([3,2,1,8]);
oneSwap([2,1,1,2]);