我正在尝试编写一个函数,该函数将检查是否可以使用数组中的值的单个交换对数组进行排序。
例如: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));
答案 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]);