滑动拼图逆序数奇偶性调整:如何将奇数逆序数的数组转为偶数
逆序数奇偶性调整实现方法
逆序数定义
逆序数:对于拼图面板,逆序数指任意两个块i、j满足i<j,但按行优先顺序(先第0行,再第1行,依此类推)遍历面板时i出现在j之后的配对。
现有基础信息
给定待处理数组:arr = [1, 20, 6, 4, 22 , 5 , 12 , 3];
提供的逆序数统计函数:
function getInvCount(arr){ let inv_count = 0; for(let i=0; i<arr.length-1; i++){ for(let j=i+1; j<arr.length; j++){ if(arr[i] > arr[j]) inv_count++; } } return inv_count; }
实现逻辑
交换任意两个相邻元素时,仅会改变这两个元素的相对顺序,其余所有元素对的相对顺序不受影响,因此逆序数的奇偶性会直接翻转。基于这个特性可以快速调整:
- 调用
getInvCount计算当前数组的逆序数 - 若逆序数为偶数,无需调整直接返回原数组
- 若逆序数为奇数,交换数组最后两个相邻元素,即可将逆序数奇偶性翻转为偶数
代码实现
function adjustInvParity(arr) { // 拷贝数组避免修改原数据 const targetArr = [...arr]; const currentInv = getInvCount(targetArr); // 逆序数为奇数时调整 if (currentInv % 2 !== 0) { // 交换最后两个相邻元素 [targetArr[targetArr.length - 1], targetArr[targetArr.length - 2]] = [targetArr[targetArr.length - 2], targetArr[targetArr.length - 1]]; } return targetArr; }
效果验证
针对给定的数组计算可得逆序数为14,属于偶数,无需调整即可直接使用。如果数组逆序数为奇数,执行上述调整后逆序数奇偶性会变为偶数,不影响拼图的可解性判断逻辑。
内容的提问来源于stack exchange,提问作者Rey
相关产品推荐
相关产品推荐

