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

生成由"a-z"26 位字母组成的 ,五位长度的所有字符串,不限语言,不限方法!

  •  
  •   xming · 2014-09-12 15:10:49 +08:00 · 7552 次点击
    这是一个创建于 3003 天前的主题,其中的信息可能已经有所发展或是发生改变。
    62 条回复    2014-09-13 21:30:57 +08:00
    bigcoon
        1
    bigcoon  
       2014-09-12 15:31:58 +08:00   ❤️ 1
    var a = 'abcdefghijklmnopqrstuvwxyz';
    var f = function (d, p) {
    !p && (p = '');
    for (var i = 0; i < a.length; i++) {
    var s = a[i], s2 = p + s;
    if (s2.length < d)f(d, s2);
    else console.log(s2);
    }
    }
    f(5);
    Automan
        2
    Automan  
       2014-09-12 15:34:27 +08:00   ❤️ 1
    重复还是不重复?
    ChanneW
        3
    ChanneW  
       2014-09-12 15:37:22 +08:00
    26^5
    kamal
        4
    kamal  
       2014-09-12 15:43:28 +08:00
    这是考手写排列公式?
    clino
        5
    clino  
       2014-09-12 15:44:11 +08:00
    python:

    import itertools
    print map("".join,list(itertools.product("abcdefghijklmnopqrstuvwxyz",repeat=5)))
    clino
        6
    clino  
       2014-09-12 15:47:46 +08:00   ❤️ 1
    不用map会更好一点,这样不会占太多内存
    import itertools
    for l in itertools.product("abcdefghijklmnopqrstuvwxyz",repeat=5):print "".join(l)
    ziyuan
        7
    ziyuan  
       2014-09-12 15:49:23 +08:00   ❤️ 1
    java

    import java.util.ArrayList;
    import java.util.List;

    public class Test {
    private static char[] is = new char[] { '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'};
    private static int total;
    private static int m = 5;
    public static void main(String[] args) {
    List<Integer> iL = new ArrayList<Integer>();
    new Test().plzh("", iL, m);
    System.out.println("total : " + total);
    }
    private void plzh(String s, List<Integer> iL, int m) {
    if(m == 0) {
    System.out.println(s);
    total++;
    return;
    }
    List<Integer> iL2;
    for(int i = 0; i < is.length; i++) {
    iL2 = new ArrayList<Integer>();
    iL2.addAll(iL);
    if(!iL.contains(i)) {
    String str = s + is[i];
    iL2.add(i);
    plzh(str, iL2, m-1);
    }
    }
    }
    }
    imn1
        8
    imn1  
       2014-09-12 15:52:30 +08:00   ❤️ 2
    import itertools
    list("".join(x) for x in itertools.product('abcdefghijklmnopqrstuvwxyz', repeat=5))
    YouXia
        9
    YouXia  
       2014-09-12 15:53:56 +08:00   ❤️ 1
    题意有点不明啊,是否有序啊,比如 a b c d e 与 a c b d e 是否相同?
    xming
        10
    xming  
    OP
       2014-09-12 15:58:41 +08:00
    @Automan 不能重复,要不同
    xming
        11
    xming  
    OP
       2014-09-12 15:59:06 +08:00
    @YouXia 无序的
    xming
        12
    xming  
    OP
       2014-09-12 16:00:55 +08:00
    @clino 不计算内存消耗,只要不卡死。
    ziyuan
        13
    ziyuan  
       2014-09-12 16:04:27 +08:00
    @imn1 python居然这么方便啊。。赞
    hahastudio
        14
    hahastudio  
       2014-09-12 16:07:12 +08:00   ❤️ 1
    那么就
    from itertools import combinations
    from string import ascii_lowercase as lowercase
    for c in combinations(lowercase, 5):
    ....print ''.join(c)
    toctan
        15
    toctan  
       2014-09-12 16:07:52 +08:00   ❤️ 4
    Ruby

    ('aaaaa'..'zzzzz').to_a
    imn1
        16
    imn1  
       2014-09-12 16:09:20 +08:00
    itertools还是太慢了,array+tobytes应该更快,或者用numpy或pandas直接生成一个数字矩阵,再chr/tobytes后合并变形~
    机器太旧,不测试了~
    rails3
        17
    rails3  
       2014-09-12 16:09:26 +08:00
    @toctan ruby更方便
    paolongtao
        18
    paolongtao  
       2014-09-12 16:10:44 +08:00
    @toctan 哈哈
    iptux
        19
    iptux  
       2014-09-12 16:15:08 +08:00   ❤️ 3
    BASH 来一发

    ```bash
    echo {a..z}{a..z}{a..z}{a..z}{a..z}
    ```
    ChiangDi
        20
    ChiangDi  
       2014-09-12 16:15:26 +08:00
    哈哈哈哈看起来没有哪种语言能短过 Ruby 了。
    minix
        21
    minix  
       2014-09-12 16:20:47 +08:00   ❤️ 1
    linux命令符输入 < /dev/urandom LC_CTYPE=C tr -dc a-z | head -c5
    hahastudio
        22
    hahastudio  
       2014-09-12 17:00:20 +08:00
    @toctan 貌似 LZ 要的是组合?
    zhs227
        23
    zhs227  
       2014-09-12 17:28:01 +08:00
    @hahastudio 用node运行了一把楼主的脚本,生成的是排列。
    ruby的结果是一样的。
    hahastudio
        24
    hahastudio  
       2014-09-12 17:30:17 +08:00
    @zhs227 LZ 给脚本了?
    zhs227
        25
    zhs227  
       2014-09-12 17:36:10 +08:00
    @hahastudio 汗,看错了,运行的是一楼的脚本。

    个人理解,abcde和acbde不应该理解为同一个字符串,另外楼主要求长度一定为5.
    hahastudio
        26
    hahastudio  
       2014-09-12 17:44:54 +08:00
    @zhs227 主要是不知道 LZ 指的这个“无序的” 是什么
    我觉得应该指的是组合= =
    jevonszmx
        27
    jevonszmx  
       2014-09-12 18:28:54 +08:00   ❤️ 1
    ```php


    # 不管有木有重复的
    for($i = 0;$i < 5;$i ++){ echo chr(rand(97,122)); }

    # 不能有重复的

    $chars = array();
    for($i = 97;$i <= 122;$i ++){
    $chars = array_unique($chars);
    if (5 == count($chars)) {
    break;
    }
    $chars[] = chr(rand(97,122));
    }
    $chars = implode('', $chars);
    echo($chars);

    ```
    orzfly
        28
    orzfly  
       2014-09-12 18:33:54 +08:00   ❤️ 1
    @toctan [*'aaaaa'..'zzzzz']
    billlee
        29
    billlee  
       2014-09-12 18:52:34 +08:00   ❤️ 1
    char str[] = "aaaaa";
    while(str[0] <= 'z'){
    printf("%s\n", str);
    for(int i=4; i>=0; i--){
    str[i]++;
    if(str[i] > 'z'){
    str[i] = 'a';
    }else{
    break;
    }
    }
    }
    ffffwh
        30
    ffffwh  
       2014-09-12 18:59:29 +08:00
    排列组合嘛,好像够资格上算法书了。
    当然库函数就。。。
    feiyuanqiu
        31
    feiyuanqiu  
       2014-09-12 20:22:01 +08:00
    for ($i = 'a'; $i <= 'zzzzz'; $i++) {
    var_dump($i);
    }
    lightening
        32
    lightening  
       2014-09-12 20:34:17 +08:00
    @zhs227 组合的话 Ruby:

    ('a'..'z').to_a.combination(5).map(&:join)
    feiyuanqiu
        33
    feiyuanqiu  
       2014-09-12 20:39:44 +08:00
    31楼的回复有问题,我改了一下...但是现在有需求要做,待会才有时间调试...
    jesse_luo
        34
    jesse_luo  
       2014-09-12 21:19:41 +08:00
    #include <stdio.h>

    #define LEN 5

    void gen(char *str, int last) {
    char i;
    for (i = 'a'; i <= 'z'; i++)
    {
    *str = i;
    if (0 != last) gen(str+1, last-1);
    else printf("%s\n", str-LEN+1);
    }
    }

    int main() {
    char str[LEN];
    gen(str, LEN-1);
    }

    c的……
    feiyuanqiu
        35
    feiyuanqiu  
       2014-09-12 21:25:08 +08:00
    for ($i = 'aaaaa'; $i <= 'zzzzz'; $i++) {
    var_dump($i);
    }
    好了,php的
    jucelin
        36
    jucelin  
       2014-09-12 21:25:40 +08:00
    题主要的是 “五位长度的所有字符串” ,楼上们提供的有点不对题吧
    P233
        37
    P233  
       2014-09-12 21:30:46 +08:00   ❤️ 1
    蛋疼的 Sass 版,不过不是字符串

    P233
        38
    P233  
       2014-09-12 21:35:04 +08:00
    打错了 22 行 $2 应该是 $e
    feiyuanqiu
        39
    feiyuanqiu  
       2014-09-12 21:42:19 +08:00
    @P233 终于遇见一个用 birds of paradise 主题的了...有品位!
    P233
        40
    P233  
       2014-09-12 22:01:56 +08:00
    @feiyuanqiu 一直觉得这个看着比较舒服,设计也很合理 :)
    zhs227
        41
    zhs227  
       2014-09-12 22:08:40 +08:00
    @lightening 高手,刚出去的路上还在想着组合有什么办法呢, Rails的数组太强大了
    artwalk
        42
    artwalk  
       2014-09-12 22:25:08 +08:00
    ```Swift
    let alp = "abcdefghijklmnopqrstuvwxyz"

    func puts (s:String, i:Int) {
    if i <= 0 {
    println(s)
    return
    }

    for c in alp {
    puts (("\(c)" + s), i - 1)
    }
    }

    puts ("", 5)


    ```

    求更简单的办法

    PS:
    1. Playground 测试用的 `puts ("", 3)` ,没敢直接上 5
    2. Ruby 的太变态了,这也是我喜欢的原因
    orzfly
        43
    orzfly  
       2014-09-12 22:29:38 +08:00
    @lightening combination 是不会重复的,你需要 repeated_combination。

    [*?a..?z].repeated_combination(5).map(&:join)
    orzfly
        44
    orzfly  
       2014-09-12 22:30:59 +08:00
    顺带一提 ruby 还可以这样…… [*?a*5..?z*5]
    zakokun
        45
    zakokun  
       2014-09-12 22:41:10 +08:00   ❤️ 1
    这是我写的很傻的php....生成的文件有67M......
    <script src=".js"></script>
    feiyuanqiu
        46
    feiyuanqiu  
       2014-09-12 23:21:37 +08:00
    @zakokun ...不用这么复杂,字母都是ascii码,可以用循环来生成的,一行代码就解决了
    26*26*26*26*26*6/1024/1024 = 67
    你的结果是对的...
    lightening
        47
    lightening  
       2014-09-12 23:29:08 +08:00
    @orzfly 啊,看错需求了……
    zakokun
        48
    zakokun  
       2014-09-12 23:37:24 +08:00
    @feiyuanqiu 看了下你写的,好神奇......学习了
    xiaowangge
        49
    xiaowangge  
       2014-09-12 23:52:36 +08:00   ❤️ 1


    笨办法来了。
    xiaowangge
        50
    xiaowangge  
       2014-09-13 00:01:27 +08:00
    又读了一遍需求,是「所有」 :-)
    feiyuanqiu
        51
    feiyuanqiu  
       2014-09-13 00:59:05 +08:00
    @zakokun ...我的写错了,不能用 <=号,只能用< 或者!=。

    原因是:在PHP中,对字母进行增减运算时遵循的是Perl的方式而不是C的,在Perl中,是通过首字母比较大小:比如,b > az。

    具体到这里:
    当$i = 'zzzzz'的时候,$i <= 'zzzzz'是成立的,循环不会终止,这时$i++ => 'aaaaaa','aaaaaa' < 'zzzzz',循环继续...直到$i = 'yzzzzz',这时,$i < 'zzzzz',$i++ => 'zaaaaa', $i > 'zzzzz',循环终止。所以最后一个输出是 ’yzzzzz';

    http://stackoverflow.com/questions/4098345/why-doesnt-this-code-simply-print-letters-a-to-z

    修改之后是这样的:
    for ($i = 'aaaaa'; $i < 'zzzzz'; $i++) { echo $i; } echo $i;
    或者:
    $c = 'aaaaa';
    for ($i = 0; $i < 11881376; $i++) { echo $c++; }
    mudenng
        52
    mudenng  
       2014-09-13 01:00:50 +08:00
    C++版的。。。就是个DFS
    feiyuanqiu
        53
    feiyuanqiu  
       2014-09-13 01:03:40 +08:00
    for ($c = 'aaaaa', $i = 0; $i < 11881376; $i++, $c++) { echo $c; }
    zeq
        54
    zeq  
       2014-09-13 08:36:06 +08:00
    zeq
        55
    zeq  
       2014-09-13 08:47:07 +08:00
    @zeq 搞错了, 唉~
    jsq2627
        56
    jsq2627  
       2014-09-13 12:17:12 +08:00
    上面都是发代码的,我来发点算法的知识吧。
    http://www.cnblogs.com/autosar/archive/2012/04/08/2437799.html
    zakokun
        57
    zakokun  
       2014-09-13 13:00:18 +08:00
    @feiyuanqiu 确实,不能用 $i <='zzzzz' 但我想了下, 'zaaaaa', 依然是小于 'zzzzz'的诶,直到 $i='zzzzzy'的时候,$i+1='zzzzzz'这时候才大于'zzzzz' 才会跳出循环.是这样吧?
    feiyuanqiu
        58
    feiyuanqiu  
       2014-09-13 13:11:07 +08:00   ❤️ 1
    @zakokun 实际上是zzzzyz
    zqhong
        59
    zqhong  
       2014-09-13 13:23:59 +08:00
    @xiaowangge 你这样好像是随机产生 'a-zA-Z'的5位数字吧?
    我这边的运行结果:
    ➜ src ./test.py
    RVTwn
    ➜ src ./test.py
    akJtF
    ➜ src ./test.py
    IXSJU
    zakokun
        60
    zakokun  
       2014-09-13 13:29:19 +08:00
    @feiyuanqiu you are right......
    coolicer
        61
    coolicer  
       2014-09-13 14:33:40 +08:00
    ruby开挂啊
    jedihy
        62
    jedihy  
       2014-09-13 21:30:56 +08:00 via iPhone
    这是算法题,用dfs
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3008 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 66ms · UTC 13:00 · PVG 21:00 · LAX 05:00 · JFK 08:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.