我想生成一个数字和字母位置格式相同的字符串序列

e.g ABC12,DEV45,UED23,...

还需要一个公式来从当前字符串生成下一个字符串。 例如,从上面的字符串:

f(ABC12)=DEV45
f(DEV45)=UED23

我想用它来以定义的格式生成下一个“外观随机”唯一代码。 您建议使用哪种算法? 非常感谢。

#1楼 票数:3

格式为“ ABC12”的代码基本上是5位数字,其中前3位以26为基数,后2位为十进制。 其中有26×26×26×10×10或1,757,600。 每个代码很容易转换为相应的数字并返回:

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 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
ABC12 = ((( 0 * 26 +  1) * 26 +  2) * 10 +  1) * 10 +  2 =     2,812
DEV45 = ((( 3 * 26 +  4) * 26 + 21) * 10 +  4) * 10 +  5 =   215,345
UED23 = (((20 * 26 +  4) * 26 +  3) * 10 +  2) * 10 +  3 = 1,362,723
    2,812 / 10 =     281 rem:  2
      281 / 10 =      28 rem:  1
       28 / 26 =       1 rem:  2
        1 / 26 =       0 rem:  1
        0 / 26 =       0 rem:  0  ->  0 1 2 1 2  ->  ABC12

  215,345 / 10 =  21,534 rem:  5
   21,534 / 10 =   2,153 rem:  4
    2,153 / 26 =      82 rem: 21
       82 / 26 =       3 rem:  4
        3 / 26 =       0 rem:  3  ->  3 4 21 4 5  ->  DEV45

1,362,723 / 10 = 136,272 rem:  3
  136,272 / 10 =  13,627 rem:  2
   13,627 / 26 =     524 rem:  3
      524 / 26 =      20 rem:  4
       20 / 26 =       0 rem: 20  ->  20 4 3 2 3  ->  UED23

要以伪随机方式循环从0到1,757,599之间的数字,请选择一个步长,该步长在遍历每个数字后仅返回零,然后将下一个值计算为:

x -> (x + step) % 1,757,600

所以step应该没有1,757,600的共同因素:

1,757,600 = 2 * 2 * 2 * 2 * 2 * 5 * 5 * 13 * 13 * 13

最好大于26 * 26 * 10 * 10,以便每一位数字随步长变化; 因此,例如:

step = 3^11 = 177,147

给出以下顺序:

   2,812                                       ABC12
(  2,812 + 177,147) % 1,757,600 = 179,959  ->  CRF59
(179,959 + 177,147) % 1,757,600 = 357,106  ->  FHJ06
                                               ...

这是一个代码示例来演示该方法。 这有点奇怪,因为JavaScript。 在类似C的语言中,字符串基本上是整数数组,该代码将更简单。

 function nextCode(current) { var base = [26,26,26,10,10], symbol = [65,65,65,48,48], char = [], number = 0; for (var i = 0; i < 5; i++) { var digit = current.charCodeAt(i) - symbol[i]; number = number * base[i] + digit; } number = (number + 177147) % 1757600; for (var i = 4; i >= 0; i--) { var remainder = number % base[i]; number = (number - remainder) / base[i]; char[i] = String.fromCharCode(symbol[i] + remainder); } return char.join(''); } document.write("ABC12 &rarr; " + nextCode("ABC12")); 

#2楼 票数:0

一种方法是预先计算数组形式的字母部分,然后将其与连续数字组合。 对于字母数组:

  1. AAA, AAB, AAC, ..., ABA, ABB, ..., ZZZ (总共17576个元素)-所有可能的独特组合;
  2. 随机排列数组-现在它们处于(a)随机和(b)预测顺序;
  3. 从任何给定值开始->使用数组中的下一个元素。

对于数字部分,请使用简单的计数:

  1. 00开始;
  2. 从任何给定值->增加1;
  3. 如果结果为100 ,请使用下一个字母部分-这样每个字符串都是唯一的。

这提供了1757600个唯一字符串,如ABC12

  ask by Elveryx translate from so

未解决问题?本站智能推荐:

1回复

在最短的时间内获得字符串中k个长度的子字符串重复的最佳算法是什么?[重复]

这个问题已经在这里有了答案: 将Python列表拆分为重叠块的列表 4个答案 是否有任何算法可以获取字符串中重复重叠子字符串的数量? 这个问题类似于将Python列表拆分为重叠块的列表 ,但是在我的情况下,更改的元素是每个子字符串的第一个和最后一个元素! 例如,当: 然
1回复

哪种算法可用于将字符串序列分类为块,从而避免使用某个元素进行初学者?

假设有一个列表: ['a', 'a', 'a', 'b', 'a', 'a', 'b', 'b', 'b'] 。 您可以使用哪种算法将其分类为具有2-4个元素的组? 以'b'开头的组应该尽可能少。 在这个例子中: aa | aba | abbb aa | aba | abbb 这是
6回复

无限字符串中字符串的第一个索引-Java

简介我有一个无限的字符串。 这个字符串的长度在我们的想象中是无限的,不能限制。假设我们在字符串中有这样一个序列: “123456789……” 数字 9 后面的点实际上代表下一个序列。 所以,它会是这样的: “……7891011121314……” 要求在本节中,我想解释一下要求。 要求是找到输
1回复

如何计算与子集匹配的某些字符串的排列数量?

我有一个字符串S和一组S排列的子集,称为M。M的元素限制了S的允许排列。我想计算S的允许排列的数量。对M的允许元素的唯一限制是包含的子集对应于某些排列的开始或结束。 例如,说S ='ABC'和M = {'AB','BC'}。 因此,“ ABC”的唯一允许排列是“ ABC”和“ CBA”。
1回复

序列(字符串)包括以滑动方式重复另一个序列

我有两个数组,但将使用字符串来使解释更清晰。 需要找出第一个字符串是滑动重复还是第二个字符串。 示例(管道仅用于视觉分隔,您可能认为它们不存在): 好的,将尝试给出另一个解释以使其更清楚。 我们有需要检查的第一个字符串和作为模式的第二个字符串。 我们无限次地重复这个模式。 如果第一个字符串是我们无限
2回复

最短的常见超弦算法?

我在这里尝试编码这个问题: 但我想找到一种算法来分解解决问题的步骤。 我似乎无法在网上找到任何有用的东西,所以我来这里询问是否有人知道我可以用来引用解决这个问题的算法的资源。
1回复

查找连续重复序列的算法

我正在寻找一种在基因组序列中找到短串联重复序列的算法。 基本上,给定一个非常长的字符串,该字符串只能包含4个字符“ ATCG”,因此我需要找到2-5个字符之间彼此相邻的短重复序列。 例如:TACATGAGATCATGATGATGATGATGGAGCTGTGAGATC将给ATGATGATG
3回复

根据有序的字符串对生成直观的唯一字符串?

相关: 基于一对字符串生成唯一的字符串 我想生成一个直观的唯一字符串来表示有序的字符串对。 显然, stringA + stringB非常直观,但如果考虑例如"st" + "ring" == "stri" + "ng" == "string" ,则不是唯一的。 另外,与链接的OP不同