我想在不移动偶数的情况下对奇数进行排序。例如,当我写:
sortArray([5, 3, 2, 8, 1, 4])
预期结果是:
[1, 3, 2, 8, 5, 4]
我是JavaScript的新手,我在互联网上遇到了让我感到困惑的挑战。我通常不会在互联网上发帖要求解决方案,但我已经尝试了几个小时,我想用JavaScript学习这个概念。
挑战表明:
你有一组数字。 你的任务是对升序奇数进行排序,但偶数必须在他们的位置。 零不是奇数,你不需要移动它。如果您有一个空数组,则需要将其返回。
到目前为止,这是我的代码,请放轻松我,我正处于编程的开始阶段。
function sortArray(array) {
let oddNums = [];
for(let i = 0; i < array.length; i++) {
if(array[i] % 2 !== 0) {
oddNums.push(array[i]);
}
}
oddNums = oddNums.sort((a,b)=> a-b);
array.concat(oddNums);
array = array.sort((a,b) => a-b);
return array;
}
答案 0 :(得分:5)
您可以为奇数索引获取辅助数组,为奇数索引获取另一个数组,对它们进行排序并将它们应用于先前存储的原始数组索引。
var array = [5, 3, 2, 8, 1, 4],
indices = [];
array
.filter((v, i) => v % 2 && indices.push(i))
.sort((a, b) => a - b)
.forEach((v, i) => array[indices[i]] = v);
console.log(array);
答案 1 :(得分:2)
这是一个主要使用内置数组方法的解决方案。只获取赔率列表,排序,然后通过原始地图进行映射,如果项目是奇数,则用第一个排序的奇数替换每个项目,如果是偶数则替换为自己:
const array = [5, 3, 2, 8, 1, 4] // to: [1, 3, 2, 8, 5, 4]
function sortOddsOnly(arr) {
const odds = arr
.filter(x => x%2)
.sort((a, b) => a - b);
return arr
.map(x => x%2 ? odds.shift() : x);
}
console.log(sortOddsOnly(array));
答案 2 :(得分:1)
我有这样的解决方案。
构建排序的奇数数组1st,然后按顺序填充其余的偶数:
const arr = [5, 3, 2, 8, 1, 4];
const odd = arr.filter(i => i%2 !== 0).sort();
let i = 0,
result = [];
arr.forEach(e => {
if (e%2 === 0) {
result.push(e)
} else {
result.push(odd[i]);
i++;
}
});
console.log(result);
答案 3 :(得分:0)
只是这样做:
arr.sort((a, b) => a%2 && b%2 ? a - b : 0)
如果可行,则取决于浏览器使用的排序算法。 与浏览器无关的版本:
for(const [i1, v1] of arr.entries())
for(const [i2, v2] of arr.entries())
if( v1%2 && v2%2 && (i1 < i2) === (v1 > v2))
([arr[i1], arr[i2]] = [v2, v1]);
答案 4 :(得分:0)
以下是使用略微定制的selection sort:
的可能解决方案
EOF
前两个var xs = [5, 3, 2, 8, 1, 4];
console.log(sortOddsOnly(xs));
function sortOddsOnly (xs) {
var n = xs.length;
for (var i = 0; i < n - 1; i++) {
if (xs[i] % 2 === 1) {
for (var j = i + 1; j < n; j++) {
if (xs[j] % 2 === 1) {
if (xs[i] > xs[j]) {
var min = xs[j];
xs[j] = xs[i];
xs[i] = min;
}
}
}
}
}
return xs;
}
保证我们只交换奇数(if
表示“x是奇数”)。
答案 5 :(得分:0)
可能的解决方案之一就是这个。我所做的是使用 Array.prototype.filter
创建新数组odd
(原始数组中具有奇数位置的数组),然后使用 Array.prototype.sort
<对该数组进行排序/ strong>即可。然后使用 Array.prototype.map
使用odd
数组更改原始数组的所有奇数元素的值。
x1=[5, 3, 2, 8, 1, 4];
function sortArray(array) {
var odd = array.filter((x,i) => (i+1) % 2 ).sort((a,b) => a > b); //sort odd position and store that in new array
return array.map((x,i) => (i+1) % 2 ? odd.shift() : x ); //if i is odd then replace it with element from
//odd array otherwise keep the element as it is
}
console.log(sortArray(x1));
&#13;
答案 6 :(得分:-1)
def sort_array(source_array):
b = sorted([n for n in source_array if n % 2 != 0])
c = -1
d = []
for i in source_array:
c = c+1
if i % 2 != 0 :
d.append(c)
for x in range (len(d)):
z = d[x]
source_array[z] = b[x]
return source_array