【问题标题】:Java word generating algorithmJava 单词生成算法
【发布时间】:2012-08-06 10:11:14
【问题描述】:

我想创建一个单词生成器,但在某种程度上它几乎看起来像是一个数字系统。 十六进制从0f,这个算法应该从az。所以创建的词是这样的(每个- 表示一个新词):

a - b - c - d - ... - z - aa - ab - ac - ad - ... - ba - bb - bc - ...

例如,每个单词都存储在一个文件中,因此该文件将显示为:

a  
b  
c  
d  
...  
z  
aa  
ab  
ac  
...  

我认为这可以通过大量嵌套的for 循环和ifs 来实现,但是有没有更简单的方法可以做到这一点?您不必告诉我整个算法,但非常感谢您朝正确的方向轻推。

【问题讨论】:

标签: java algorithm word generator


【解决方案1】:

如果您正在寻找创建单个随机单词,请按照以下步骤操作:

  1. 填充字符数组:char[] arr = { 'a', 'b', ... , 'z'}
  2. 获取表示字符串大小的随机整数。
  3. 初始化一个空字符串s
  4. 从0迭代到绘制的长度,在[0,arr.length)范围内绘制一个数字,让它成为x,并将arr[x]附加到字符串s

如果您正在寻找所有可能性,那么您正在寻找所有combinations,而我认为最简单的方法是使用递归。这个想法是“猜测”第一个字符,并在字符串的后缀上运行递归 - 对第一个字符的所有第一个可能性重复此操作,你会得到所有组合。

伪代码:

getCombinations(set,idx,length,current):
  if (idx == length):
    set.add(copy(current))
    return
  for each char c:
    current[idx] = c //setting the next char
    getCombinations(set,idx+1,length,current) //invoking recursively on smaller range

使用getCombinations([],0,length,arr) 调用,其中[] 是一个将保存结果的空集,length 是生成的组合的长度,arr 是一个空数组。
要获得小于length 的组合,您可以在此过程中添加子字符串或使用更小的length 调用。

注意,组合的数量在词的长度上是指数的,所以会消耗很多时间。

【讨论】:

    【解决方案2】:

    创建一个将整数映射到字符序列的函数。即:

     0  -> a
     1  -> b
     ...
     26 -> aa
    

    等等。您可以使用它来迭代地创建特定单词或单词列表。

    在您的算法中,您将大量使用模数 %26...

    【讨论】:

      【解决方案3】:

      我不知道你是否可以使用任何随机整数函数库。但是,我给你一个基于此的简单伪代码:

      1) Generate a Random Number I from 1 to 10.
      2) For J = 0 to I
      byte array[j] =  (byte) Generate a Random Number from 0 to 128.
      3) For J = 0 to I
      String st = st + (char) byte array[j]
      

      字符串将是一个随机单词。简单的。但是,我不知道是否可以接受。

      【讨论】:

        【解决方案4】:

        轻推服务:

        是的,这是可能的。您运行单个 for 循环,然后将每个计数器值转换为以 26 为基数。然后新数字中的每个数字都将编码一个字母。请参阅here 了解如何将数字转换为任意基数。 (对不起广告溢出页面)

        【讨论】:

        • 正在读取该页面 atm。别担心,我有广告拦截 ;)
        【解决方案5】:

        你需要定义你的单词有多长,否则这将是无限的。

        这在数学中称为组合,看看here你可以选择适合你需要的算法。

        【讨论】:

          【解决方案6】:

          假设您知道列表的长度,并且“单词”再次具有随机长度且完全随机。然后您可以执行以下操作(它会打印单词,您可以将它们写入文件):

          import java.util.Random;
          ...
          String alphabet = "qwertyuioplkjhgfdsazxcvbnm";
          Random r = new Random();
          
          for(int i = 0; i < list_length; i++) {
            int word_size = r.nextInt(word_max_length);
            String word = "";
            for(int j = 0; j < word_size; j++) {
              word += alphabet.charAt(r.nextInt(alphabet.length()));
            }
            System.out.println(word);
          }
          

          【讨论】:

            【解决方案7】:
                final char[] tabC = "abcdefghijklmnopqrstuvwxyz".toCharArray();
                for (final char c1 : tabC) {
                    System.out.println(c1 + "\t" + c1);
                    for (final char c2 : tabC) {
                        System.out.println(Character.toString(c1)
                            + Character.toString(c2) + "\t" + (c1 + (c2 << 6)));
                    }
                }
            

            只需验证

            输出

            a   97
            aa  6305
            ab  6369
            ac  6433
            . . .
            ar  7393
            as  7457
            az  7905
            b   98
            ba  6306
            bb  6370
            bc  6434
            bd  6498
            . . . 
            
            
            rz  7922
            s   115
            sa  6323
            sb  6387
            sc  6451
            sd  6515
            se  6579
            

            【讨论】:

              【解决方案8】:

              我会这样做:

              输入 n - 要生成的单词数,[I,J] - 单词长度的范围。

              算法:

              • 做n次:

                • i
                • 执行 i 次:(0
                • Word[j] = 'a' 和 'z' 之间的随机字符
              • 将单词添加到结果中
            • 返回结果

            • 【讨论】:

                【解决方案9】:

                这是一个输出前 1000 个单词的实现:

                for (int n = 0; n < 1000; n++) {
                   String s = Long.toString(n, 26);
                   StringBuilder word = new StringBuilder();
                   for (int i = 0; i < s.length(); i++) {
                       int value = Character.digit(s.charAt(i), 26);
                       // if it is not the right most caracter, then '1' is map to 'a', if not,
                       // '0' is map to 'a'
                       value = value + (i < s.length() - 1 ? -1 : 0);
                       word.append(Character.toChars('a' + value)[0]);
                   }
                   System.out.println(n + " -> " + word.toString());
                }
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-06-24
                  • 1970-01-01
                  • 2010-09-16
                  • 1970-01-01
                  • 2018-05-05
                  • 1970-01-01
                  相关资源
                  最近更新 更多