我有一个说$a=array(1, 2, 6, 4, 5, 3);
的数组,可以按升序在交换中排序,例如交换6和3。如果可能的话,我的函数应该返回true,否则返回false。例如array(10,30,20,40,50,60,70)返回true,而array(80,10,30,20,40,50,60,70)返回false,因为它将花费多个交换到目前为止,我已经按照升序对数组进行排序。
function checksort($arr) {
for ($i = count($arr) - 1; $i > 0; $i--) {
if ($arr[$i] < $arr[$i - 1]) {
$j = $i - 1;
while ($j > 0) {
$j--;
$temp = $arr[$i];
$arr[$i] = $arr[$j + 1];
$arr[$j + 1] = $temp;
break;
}
}
}
$sortedarray = $arr;
sort($arr);
if ($sortedarray == $arr) {
return true;
}
return false;
}
$a = array(1, 2, 6, 4, 5, 3);
echo checksort($a);
我得到的结果是错误的,应该是正确的。我知道问题是因为该数组在for循环中的每个真实条件下都被重写,但是同时$i
变为-1,并且到达无法进一步检查整个数组的程度。条件。
答案 0 :(得分:3)
您的函数将仅交换彼此相邻的项,而不交换数组的另一端。
使用array_diff_assoc()
仅查看原始数组和排序数组中的差异可能会更简单,这意味着这将使项目数混乱。如果大于2,则返回false,否则返回true ...
function checksort($arr){
$b = $arr;
sort($b);
return count(array_diff_assoc($arr, $b))<=2;
}