2个不同数组中的常见元素

时间:2012-10-05 12:11:40

标签: java

我正在制作一个基本的编码算法,它接受输入,编码(使用随机数),然后解密。数组填充类型“char”。它单独加密每个字母。如何在编码字母时检查相同的字母是否未被编码为其他字母。

实施例

编码

ABC

a给出随机数2 b给出随机数5 我怎样才能防止c被给予2或5

非常感谢!

2 个答案:

答案 0 :(得分:0)

这是我的主张:

    Character yourInput[] = {'a', 'b', 'c', 'd'};
    int yourInputEncoded[] = new int[yourInput.length];
    Hashtable<Character, Integer> charToInt = new Hashtable<Character, Integer>();
    ArrayList<Integer> alreadyUsedInt = new ArrayList<Integer>();
    Random randomize = new Random();
    for(int i = 0; i < yourInput.length; i++)
    {
        if(!charToInt.containsKey(yourInput[i]))
        {
            int randomInt = randomize.nextInt();
            while(!alreadyUsedInt.contains(randomInt))
                randomInt = randomize.nextInt();

            charToInt.put(yourInput[i], randomInt);
            alreadyUsedInt.add(randomInt);
        }
        yourInputEncoded[i] = charToInt.get(yourInput[i]);
    }

对于每个char,我们检查是否与int相关联。如果不是,我们生成(随机)一个新的关联int(之前从未使用过)。 之后我们用他的关联int替换char。它:)

答案 1 :(得分:0)

Baz的答案会起作用,但会很慢(相对来说,因为你需要为每个生成的数字搜索集合,但你可能不在乎)。

ChristofferHammarström的答案(产生N个连续数字和随机播放)有效,但缺乏随机性,因为这是加密。

这是一种获取唯一(几乎)随机数数组的算法。

  1. 确定您需要编码多少个不同的字符(caracterSetCount)
  2. 分配caracterSetCount大小
  3. 的int数组
  4. 生成随机数以供日后使用:
  5. static final int RANDOM_RANGE = 3000;

    randomKeys = new long[caracterSetCount];
    randomKeys[0] = rand.nextInt(RANDOM_RANGE); // A number between 0 and RANDOM_RANGE 
    for (int i=1; i<caracterSetCount; ++i) {
      randomKeys[i] = randomKeys[i-1] + 1 + rand.nextInt(RANDOM_RANGE); 
      We have a pseudo random number which is strictly greater than the previous one
    }
    
    1. 如果需要,您可以随机播放该列表(因为它是订购的,您可能需要改进)
    2. 然后你有一个数组来为每个要编码的字符获取伪随机数。

      为了获得更多随机性,您可以增加RANDOM_RANGE(但请注意不要在不断添加数字时溢出);