我试图让我的代码做到这一点:
原始数组= [1,2,3,4]交换一次-> [4,1]再次交换-> [4,1]
因此结果是2
但这不起作用.这是我到目前为止的内容:
function check(arr){
var sarr = [];
var cnt = 0;
var arrL = arr.length;
// Create a second copy of the array for reference
var arrCopy = [...arr];
for(let i=0; i<arrL;i++){
var maxV = Math.max(...arr);
sarr.push(maxV);
let pos = arr.indexOf(maxV);
// Remove the found number
arr.splice(pos,1);
// Check if the index of the number in the new array is same with the copy,if not then there was a swap
let ai =arrCopy.indexOf(maxV);
let si =sarr.indexOf(maxV);
if (ai !== si && (i+1)!=arrL && pos !== 0){
cnt++;
};
}
console.log(cnt);
}
check([1,4,5,6]);//Result should be 3
check([6,1]); //result should be 0
check([1,4]); //result should be 2
check([1,6]); //result should be 3
check([1,10,6,7,8,9,12,11]);//result should be 6
check([ 49,37,19,27,25,11,53, 42,57,50,55, 56,38,48,33,28,20,31,51,14,23,58,52,36,22,41,47,39,13,45,1,44,32,15,21,30,17, 60,29,59,40,24,54,46,26,43,35,34,18,16]);//result should be 54
有人可以让我知道我在做什么错吗?
最佳答案
我将从降序排列的数组开始,以获得正确的项目索引.
出于实际原因(或者只是循环的较短概念(包括检查和减量)),我从数组末尾开始循环.
然后,我检查array的值并在dame索引处取反,然后继续进行迭代.
如果值不相同,则交换期望位置i和实际位置p上的项目,并增加计数.
最后,返回计数.
function check(array) {
var reversed = array.slice().sort((a,b) => b - a),count = 0,i = array.length,p;
while (i--) {
if (array[i] === reversed[i]) continue;
p = array.indexOf(reversed[i]);
[array[i],array[p]] = [array[p],array[i]];
count++;
}
console.log(...array);
return count;
}
console.log(check([1,6])); // 3
console.log(check([6,1])); // 0
console.log(check([1,4])); // 2
console.log(check([1,6])); // 3
console.log(check([1,11])); // 6
console.log(check([ 49,16])); // 54
.as-console-wrapper { max-height: 100% !important; top: 0; }