V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
MinYa
V2EX  ›  问与答

javascript 实现 26 个字母加 10 个数字的 1-n 位数的任意组合,有没有能简写的写法?

  •  
  •   MinYa · 2017-08-11 09:55:03 +08:00 · 2085 次点击
    这是一个创建于 2661 天前的主题,其中的信息可能已经有所发展或是发生改变。
    config.js

    'use strict';

    module.exports = {
    stringArr: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
    ],
    urlLength: 4
    }
    ---------------------------
    index.js

    let config = require('./config/config');
    let arr = [];

    function matchGroup(countLength) {
    for (let i = 0; i < countLength; i++) {
    if (i == 0) {
    for (let j = 0; j < config.stringArr.length; j++) {
    let reqUrl = 'http://www.' + config.stringArr[j] + '.com';
    arr.push(reqUrl);
    }
    } else if (i == 1) {
    for (let j = 0; j < config.stringArr.length; j++) {
    for (let k = 0; k < config.stringArr.length; k++) {
    let reqUrl = 'http://www.' + config.stringArr[j] + config.stringArr[k] + '.com';
    arr.push(reqUrl);
    }
    }
    } else if (i == 2) {
    for (let j = 0; j < config.stringArr.length; j++) {
    for (let k = 0; k < config.stringArr.length; k++) {
    for (let l = 0; l < config.stringArr.length; l++) {
    let reqUrl = 'http://www.' + config.stringArr[j] + config.stringArr[k] + config.stringArr[l] + '.com';
    arr.push(reqUrl);
    }
    }
    }
    } else if (i == 3) {
    for (let j = 0; j < config.stringArr.length; j++) {
    for (let k = 0; k < config.stringArr.length; k++) {
    for (let l = 0; l < config.stringArr.length; l++) {
    for (let m = 0; m < config.stringArr.length; m++) {
    let reqUrl = 'http://www.' + config.stringArr[j] + config.stringArr[k] + config.stringArr[l] + config.stringArr[m] + '.com';
    arr.push(reqUrl);
    }
    }
    }
    }
    }
    ........
    }
    }

    matchGroup(config.urlLength);


    console.log(arr);
    10 条回复    2017-08-14 11:34:44 +08:00
    kolyneh
        1
    kolyneh  
       2017-08-11 13:25:07 +08:00 via Android
    生成 2-36 个随机字符和数字的组合字符串

    function randomString (length){
    return Math.random().toString(36). substring (2, length+2)
    }
    coderluan
        2
    coderluan  
       2017-08-11 15:26:11 +08:00
    ^[A-Za-z0-9]+$
    MinYa
        3
    MinYa  
    OP
       2017-08-11 16:22:34 +08:00
    @kolyneh 我不是生成组合的任意字符串,我是想拿到所有组合
    am241
        4
    am241  
       2017-08-11 16:23:38 +08:00 via Android
    十进制转 36 进制
    noe132
        5
    noe132  
       2017-08-11 19:05:36 +08:00   ❤️ 1
    https://gist.github.com/noe132/8610e59abd5e899c12acd8f9b7047a9c

    如果 n 很大,这个数组非常大,36^n。
    如果 n = 10
    36 ^ 10 = 3,656,158,440,062,976
    noe132
        6
    noe132  
       2017-08-11 19:11:20 +08:00   ❤️ 1
    n = 4 的时候一共 1679616 组合
    我在 e3 的 U 上需要运行 1.2 秒。
    n = 5 时需要 1.2 * 36 秒。
    msg7086
        7
    msg7086  
       2017-08-12 09:57:48 +08:00
    递推。

    你想想,假如你有了 3 位的全组合,放在变量 comb3 里,现在要得出 4 位的全组合 com4,需要怎么做?
    msg7086
        8
    msg7086  
       2017-08-12 10:17:53 +08:00   ❤️ 1
    咱不会写 js,用 ruby 模拟了一个。
    def comb(length)
      element = [*'a'..'z', *'0'..'9']
      result = ['']
      length.times do
       result = result.flat_map do |pre|
        element.map { |e| pre+e }
       end
      end
      result
    end

    不过说真的这个数量级已经很恐怖了,n=5 我这跑了 1 分多钟然后被 kill 了……
    用 ruby 内置方法跑的话也要不少时间。
    element.repeated_permutation(5).count # => 60466176
    9 秒。
    MinYa
        9
    MinYa  
    OP
       2017-08-14 11:32:10 +08:00
    @msg7086 我知道会很大哈,也并不是要拿到所有的, 我知道想实现一个算法,当用户传递进来的时候可以正确计算出所有组合。
    MinYa
        10
    MinYa  
    OP
       2017-08-14 11:34:44 +08:00
    @noe132 用了好多新特性,我先理一下都认不全
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1224 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:17 · PVG 02:17 · LAX 10:17 · JFK 13:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.