如何在Javascript中找到数组中缺少的数字?

时间:2018-06-15 07:51:53

标签: javascript arrays algorithm numbers

我在JS中遇到了非常棘手的任务。

我有一个包含"3 -1 0 5"

等数字的字符串

我需要从第一个(已排序)数组生成一个缺少数字的字符串。第一个排序的数组是[-1, 0, 3, 5],因此给定序列中缺少的数字是[1, 2, 4]

我试图用最现代的JS以最紧凑的方式解决它,而不只是splitparsesortmin..max如果索引为-1则推送,你懂。

5 个答案:

答案 0 :(得分:1)

您可以将filter方法与map 方法结合使用。



let array =  "3 -1 0 5 -3 7".split(' ').map(Number);
array.sort((a, b) => a-b);
missing = Array.from({length: array[array.length-1] - array[0] + 1}, 
                        (_, idx) => array[0] + idx)
               .filter(elem => !array.includes(elem));
console.log(missing);




答案 1 :(得分:1)

如果您只想要丢失的数字,可以跳过排序,因为您可以使用Math.min(...arr)Math.max(...arr)来获取循环条件并获取缺失的数字。



var str = "3 -1 0 5";

function getMissingNumber(str){
  var arr = str.split(/\s/);
  var missingNum = [];
  for(var i=Math.min(...arr); i<Math.max(...arr); i++){
     if(arr.indexOf(i.toString()) === -1){
       missingNum.push(i);
     }
  }
  return missingNum;
}
console.log(getMissingNumber(str));
&#13;
&#13;
&#13;

答案 2 :(得分:1)

您可以对缺失的部分进行拆分,映射,排序,缩小和暂停循环。稍后加入缺失的部分。

&#13;
&#13;
function getMissing(string) {
    return string
        .split(' ')
        .map(Number)
        .sort((a, b) => a - b)
        .reduce((r, v, i, a) => {
            var last = a[i - 1];
            if (!i) {
                return r;
            }
            while (++last !== v) {
                r.push(last);
            }
            return r;
        }, [])
        .join(' ');
}

console.log(getMissing('3 -1 0 5'));
&#13;
&#13;
&#13;

没有while循环

的时候会短一点

&#13;
&#13;
function getMissing(string) {
    return string
        .split(' ')
        .map(Number)
        .sort((a, b) => a - b)
        .reduce((r, v, i, a) =>
            (l => r.concat(Array.from({ length: v - l - 1 }, _ => ++l)))(a[i - 1]),
            []
        )
        .join(' ');
}

console.log(getMissing('3 -1 0 5'));
&#13;
&#13;
&#13;

答案 3 :(得分:0)

在对原始字符串数组进行排序后,您可以遍历最小和最大范围,并在中间找到缺少的项目。

使用指针(arrIndex)有助于在n复杂度(排序后)中解决此问题,并在阵列上进行单次迭代。

let array = "3 -1 0 5".split(' ').map(Number);
array.sort((a, b) => a - b);

let missing = [];
let arrIndex = 0;

for (let i = array[0]; i < array[array.length - 1]; i++) {
  if (array[arrIndex] === i) {
    arrIndex++;
  } else {
    missing.push(i);
  }
}

console.log(missing.join(' '));

答案 4 :(得分:0)

function getMissing(str) {

    const sorted = str.split(' ').map(Number).sort((a,b) => a - b);

    const [min, max] = [sorted[0], sorted[sorted.length - 1]];

    const missingArr = Array.from({length:Math.abs(max-min)}, (_,i) => i + min).filter(item => sorted.indexOf(item) === - 1);

    return missingArr.join(' ');
}

const str = "3 -1 0 5"
const result = getMissing(str);

console.log(result);