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

临睡前向 v 友请教一个问题, js 如何实现字符串‘a’到‘zzzz’的遍历?

  •  
  •   xiaoxiuaoliang · 2017-02-26 00:47:57 +08:00 · 3595 次点击
    这是一个创建于 2828 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如题中所述,使用 javascript ,如何实现从‘ a ’到‘ zzzz ’的遍历,即:
    a
    b
    ...
    z
    aa
    ab
    ...
    az
    ba
    bb
    ...
    ...
    zz
    aaa
    aab
    ...
    ...
    zzz
    aaaa
    aaab
    ...
    zzzz

    如果此题可以表述为:如何实现长度为 1 的字符串‘ a ’到长度为 4 的字符串‘ zzzz ’的遍历,那么更一般地,如何实现长度为 m 的字符串 a 到长度为 n 的字符串 b 的遍历?
    第 1 条附言  ·  2017-02-26 22:36:40 +08:00
    十分感谢 v 友们,回答很给力~

    哈哈哈 此题完结!
    第 2 条附言  ·  2017-03-02 16:57:26 +08:00

    今天有空写了一下,放在了这里: http://codepen.io/yummy/pen/aJdPRq?editors=0011

    实现了任意两个小写英文字符之间所有字符的遍历。 方法比较笨拙,但好在满足了自己的需求。

    23 条回复    2017-02-26 22:58:46 +08:00
    azh7138m
        1
    azh7138m  
       2017-02-26 00:51:25 +08:00 via Android
    这个和从 x 遍历到 y 并输出是一样的,只不过这个是 26 进制罢了
    aheadlead
        2
    aheadlead  
       2017-02-26 00:53:56 +08:00 via iPhone
    写个 dfs … 先睡了
    starvedcat
        3
    starvedcat  
       2017-02-26 03:46:45 +08:00   ❤️ 1
    这题很基础,高手应该不太会愿意动手写。本人献丑了

    MIN_LENGTH = 2;
    MAX_LENGTH = 3;

    for (var len = MIN_LENGTH; len <= MAX_LENGTH; len++) {
    var word_array = [];
    for (var j = 0; j < len; j++) {
    word_array[j] = 0
    }

    while (true) {
    var word = '';
    for (var k = 0; k < len; k++) {
    word += String.fromCharCode(97 + word_array[k]);
    }
    console.log(word);

    for (k = len - 1; k >= 0; k--) {
    if (word_array[k] < 25) {
    break;
    }
    }

    if (k == -1) {
    break;
    }

    word_array[k]++;
    for (k++; k < len; k++) {
    word_array[k] = 0;
    }
    }
    }
    des
        4
    des  
       2017-02-26 06:57:20 +08:00 via Android
    @starvedcat 换我应该会按照一楼说的方式,预先计算 m 到 n 有多少个及总共有多少个,从最小合适的数(如果最少为一位,从零开始)
    然后通过类似进制转换的方式进行映射
    aheadlead
        5
    aheadlead  
       2017-02-26 07:04:06 +08:00
    刚醒
    抱歉不是很会写 js
    用 python 代替吧

    def rich(length):
    ....alphabet = [chr(_) for _ in range(ord('a'), ord('z')+1)]
    ....fu = [[], alphabet]
    ....for i in range(1, length):
    ........fu.append([c + s for c in alphabet for s in fu[1]])
    ....return fu
    vibbow
        6
    vibbow  
       2017-02-26 07:07:39 +08:00
    @aheadlead python 的缩进......
    cyr1l
        7
    cyr1l  
       2017-02-26 07:59:51 +08:00 via iPhone
    @aheadlead V2EX 回复不能缩进,看把 python 程序员逼得。
    aheadlead
        8
    aheadlead  
       2017-02-26 08:03:00 +08:00
    @vibbow @cyr1l 蛤哈原谅我比较懒不想打开 gist
    aheadlead
        9
    aheadlead  
       2017-02-26 08:05:59 +08:00   ❤️ 1
    不过上面好像写错了一个地方,不是很懂为什么刚打错了……

    def rich(length):
    ....alphabet = [chr(_) for _ in range(ord('a'), ord('z')+1)]
    ....fu = [[], alphabet]
    ....for i in range(1, length):
    ........fu.append([c + s for c in alphabet for s in fu[i]]) # 在这里
    ....return fu
    hd7771
        10
    hd7771  
       2017-02-26 08:49:24 +08:00 via Android
    你这玩意就是 26 进制的数,直接把 10 进制转换成 26 就行了。
    wyfyw
        11
    wyfyw  
       2017-02-26 08:54:08 +08:00
    @hd7771 不一样,你想想每次都是从 aa 、 aaaa 开始的, 26 进制数显然不是。
    kindjeff
        12
    kindjeff  
       2017-02-26 09:08:14 +08:00 via iPhone
    @wyfyw 意思是你自己再手写一个进制转换就可以了。
    wyfyw
        13
    wyfyw  
       2017-02-26 09:15:47 +08:00
    @kindjeff 我的意思是如果只要特定长度的,如长度为 4 , aaaa 可以看作 0000 ,所以是 25 进制。
    wyfyw
        14
    wyfyw  
       2017-02-26 09:17:30 +08:00
    @kindjeff 我错了。。。就是二十六精致
    zhy0216
        15
    zhy0216  
       2017-02-26 09:52:10 +08:00
    def hah(length):
    ....if length == 0: return [[""]]
    ....return hah(length-1) + [[c+chr(97+i) for c in (hah(length-1)[-1]) for i in range(26)]]
    hxsf
        16
    hxsf  
       2017-02-26 09:57:35 +08:00   ❤️ 2
    zhy0216
        17
    zhy0216  
       2017-02-26 09:58:05 +08:00
    忘记加个变量 cache 一下...
    def hah(length):
    ....if length == 0: return [[""]]
    ....cached = hah(length-1)
    ....return cached + [[c+chr(97+i) for c in (cached[-1]) for i in range(26)]]
    7sDream
        18
    7sDream  
       2017-02-26 13:09:56 +08:00
    xiaoxiuaoliang
        19
    xiaoxiuaoliang  
    OP
       2017-02-26 22:16:39 +08:00
    @starvedcat 赞~ 将代码适当封装成函数就更棒了,类似 @hxsf 那样
    xiaoxiuaoliang
        20
    xiaoxiuaoliang  
    OP
       2017-02-26 22:18:32 +08:00
    @aheadlead python 基本不了解 哈哈 不过还是非常感谢你的回复,铜币已送上~
    xiaoxiuaoliang
        21
    xiaoxiuaoliang  
    OP
       2017-02-26 22:22:36 +08:00
    @zhy0216 厉害了我的司机,精简的代码总是看起来非常酷炫
    xiaoxiuaoliang
        22
    xiaoxiuaoliang  
    OP
       2017-02-26 22:30:04 +08:00
    @hxsf 铜币已奉上,非常感谢你的回复,出去浪了一天,这次完完全全的来了次"拿来主义" 嘎嘎
    hxsf
        23
    hxsf  
       2017-02-26 22:58:46 +08:00
    @xiaoxiuaoliang #22 用了 ES6 语法,用之前确定能用,或者改成 es5 语法
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2652 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 05:58 · PVG 13:58 · LAX 21:58 · JFK 00:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.