检查数字中多个数字的最快方法

时间:2016-05-24 20:25:36

标签: javascript arrays

实现以下目标的最佳方法是什么(通过将排除的数字传递给IndexOf来确保数字只有某些数字)?

function notInArray(num, arr){
    var numStr = num.toString();
    for (var i = 0, l = arr.length; i<l; i++){
        if (numStr.indexOf(arr[i]) > -1 ) return false;
    }
    return true;
}

console.log(notInArray(333331, [1, 2, 4, 6, 7, 8, 9, 0])); //false

4 个答案:

答案 0 :(得分:0)

如何使用RegEx?

function notInArray(num, arr)
{
    return !(new RegExp(arr.join("|"), "g").test(num));
}

console.log(notInArray(333331, [1, 2, 4, 6, 7, 8, 9, 0]));

如此分解,它的作用:

  1. num = 333331
  2. arr = [1, 2, 4, 6, 7, 8, 9, 0]
  3. arr.join("|") = "1|2|4|6|7|8|9|0"
  4. new RegExp(arr.join("|"), "g") = /1|2|4|6|7|8|9|0/g
  5. new RegExp(arr.join("|"), "g").test(num) = /1|2|4|6|7|8|9|0/g.test(num)基本上检查数字
  6. 中是否存在每个数字

    如果是,则表示true,然后将其反转并返回。

答案 1 :(得分:0)

如果您只处理数字,则可以使用位掩码,这样num的每个数字的检查都是在恒定时间内完成的

function notInArray(num, arr) {
    var mask = 0
    var i, l
    for (i = 0, l = arr.length; i < l; i += 1) {
      mask |= (1 << arr[i])
    }
    var numStr = num.toString();
    for (i = 0, l = numStr.length; i < l; i += 1) {
      var bit = 1 << Number(numStr[i])
      if (mask & bit) return false
    }
    return true;
}

console.log(notInArray(333331, [1, 2, 4, 6, 7, 8, 9, 0])) //false

答案 2 :(得分:0)

结合我的方法和@Mauricio Poppe优秀的位掩码理念:

/**
 * Check if the given number does not contain any of the specified digits.
 *
 * @param number Integer number in [0-Number.MAX_SAFE_INTEGER]
 * @param digits Array of accepted digits in [0-9]  
 */
function checkDigits(number, digits) {
  var mask = 0, i, l;
  for (i = 0, l = digits.length; i < l; ++i) {
    mask |= (1 << digits[i]);
  }
  while (number > 9) {
    l = number % 10;
    if (mask & (1 << l)) return false;
    number *= 0.1;
  }
  return !(mask & (1 << number));
}

console.log(checkDigits(333331, [1, 2, 4, 6, 7, 8, 9, 0])); // False
console.log(checkDigits(0, [0])); // False
console.log(checkDigits(9007199254740991, [1, 2, 3])); // False
console.log(checkDigits(0, [1])); // True
console.log(checkDigits(135, [2, 4, 6])); // True
console.log(checkDigits(9007199254740991, [3, 6, 8])); // True

请记住:{01}从01 === 1返回true。

答案 3 :(得分:0)

如果你像我一样认为,为了获得数字的个别数字,将其转换为字符串并不是一种侠义态度,那么你可能会发现自己正在编写一个递归代码。再说一遍,问“什么是最好的方式......”是什么意思?以下情况可能会变慢但对我来说就像是诗。

var getResult = $resource('api/:path/:method/:id',{path:'@api'}, {
    query: {method:'GET', params: {method:'get'}, isArray:true },

好吧,这是我对弦乐社会的贡献。我首先构造一个lut(哈希表),然后应用var n = 333331, a = [1, 2, 4, 6, 7, 8, 9, 0], nina = (n,a) => !~a.indexOf(~~(n%10)) && (n < 10 || nina(n/10,a)); console.log(nina(n,a));

Array.prototype.some()