猿问

找到最长的重复序列

有这样一个问题。我有一个方法可以将文件中的字节读入一个数组,以及在这个数组中搜索最长字节序列的方法。


private int element;

private int lastElement;

private int length;


private byte[] readByteFromFile(File name) throws IOException {

            return Files.readAllBytes(name.toPath());

        }


private void searchByte(byte[] byteMass) {

    for (int i = 0; i < byteMass.length; i++) {

        int count = 0;

        for (int j = i + 1; j < byteMass.length; j++) {

            if (byteMass[i + count] == byteMass[j]) {

                if (count >= length) {

                    length = count + 1;

                    element = i;

                    lastElement = j - count;

                }

                count++;

            } else {

                count = 0;

            }

        }

    }

}

假设我的文件包含这样一个数字序列:


444478126354444


在处理的情况下,我的方法将推断出第一次出现在 0,第二次出现在 11 和序列长度 = 4


但如果我有这样一个序列


133333444478126354444


然后我的方法会推断出第一次出现在1,第二次出现在2,序列的长度为4


如何修复,该方法继续正常工作?


潇湘沐
浏览 155回答 2
2回答

隔江千里

如果你还没有准备好,我认为这是非常重要的,以描绘出你的代码的逻辑!在寻求帮助之前尝试这样做非常重要。如果你依靠别人来解决你自己的逻辑,你作为一个程序员不会有太大的进步。话虽如此,让我们深入研究并在您的代码与问题输入一起运行时进行跟踪(这不是实际代码,我们只是在程序运行时查看这些值)byteMass = 133333444478126354444(byteMass.length = 21)length = 0&nbsp; &nbsp; 0 (i) < 21 (byteMass.length): true&nbsp; &nbsp; &nbsp; &nbsp; count = 0&nbsp; &nbsp; &nbsp; &nbsp; 1 (j) < 21: true&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1 (byteMass[0 (i + count)]) == 3 (byteMass[1 (j)]): false&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; count = 0&nbsp; &nbsp; &nbsp; &nbsp; 2 (j) < 21: true&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1 (byteMass[0 (i + count)]) == 3 (byteMass[2 (j)]): false&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; count = 0&nbsp; &nbsp; &nbsp; &nbsp; 3 (j) < 21: true&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1 == 3: false它继续这样,但是当 j = 12 时会发生一些有趣的事情&nbsp; &nbsp; &nbsp; &nbsp; 12 (j) < 21: true&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1 (byteMass[0 (i + count)]) == 1 (byteMass[12 (j)]): true&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0 (count) >= 0 (length): true&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; length = 1 (count + 1)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; element = 0 (i)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lastElement = 12 (j - count)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; count = 1至少对我来说,这看起来像是出乎意料的行为!我们想统计重复的数字,但是这个1和前面的1相差11位!我们可以通过像这样编辑内部 for 循环来解决这个问题for (int j = i + 1; j < byteMass.length && byteMass[i] == byteMass[j]; j++) {这样,一旦byteMass[i] == byteMass[j]评估为,内部循环就会中断false。现在让我们用新的内部 for 循环重新启动我们的进程byteMass = 133333444478126354444(byteMass.length = 21)length = 0&nbsp; &nbsp; 0 (i) < 21 (byteMass.length): true&nbsp; &nbsp; &nbsp; &nbsp; count = 0&nbsp; &nbsp; &nbsp; &nbsp; 1 (j) < 21 && 1 (byteMass[0 (i)]) == 3 (byteMass[1 (j)]): false&nbsp; &nbsp; 1 (i) < 21: true&nbsp; &nbsp; &nbsp; &nbsp; count = 0&nbsp; &nbsp; &nbsp; &nbsp; 2 (j) < 21 && 3 (byteMass[1 (i)]) == 3 (byteMass[2 (j)]): true&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0 (count) >= 0 (length): true&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; length = 1 (0 (count) + 1)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; element = 1 (i)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lastElement = 2 (2 (j) - 0 (count))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; count = 1 (0 (count) + 1)&nbsp; &nbsp; &nbsp; &nbsp; 3 (j) < 21 && 3 (byteMass[2 (1 (i) + 1 (count))]) == 3 (byteMass[3 (j)]): true&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1 (count) >= 1 (length): true&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; length = 2 (1 (count) + 1)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; element = 1 (i)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lastElement = 2 (3 (j) - 1 (count))这对我来说似乎是意外的行为,但我不会修复它,因为我不知道如何:我不知道 element 和 lastElement 代表什么。代码继续这样直到 j = 6:&nbsp; &nbsp; &nbsp; &nbsp; 6 (j) < 21 && 3 (byteMass[5 (1 (i) + 4 (count))]) == 4 (bteMass[3 (j)]): false&nbsp; &nbsp; 2 (i) < 21: true&nbsp; &nbsp; &nbsp; &nbsp; count = 0&nbsp; &nbsp; &nbsp; &nbsp; 3 (j) < 21: true&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 3 (byteMass[2 (2 (i) + 0 (count))]) == 3 (byteMass[3 (j)]): true&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; length = 1 (0 (count) + 1)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; element = 2 (i)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lastElement = 3 (3 (j) - 1 (count))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; count = 1 (0 (count) + 1)这再次以相同的方式继续,直到 j = 6。此时希望您能明白为什么您的程序没有按预期工作。但是我仍然没有回答如何修复它的问题。我不太明白你如何解决这个问题的思考过程,但我会和你分享我自己的首先,我们需要将问题分解成更小的块!你可以用任何你想要的方式做到这一点,但这是我的方式:我们的目标是找到最长的重复模式。那么为了做到这一点,我们需要弄清楚一个数字何时重复以及它重复了多少次如果该特定数字在序列中的其他任何地方重复特定次数。如果是这样,我们需要节省它重复的次数然后我们将重复该过程,但仅当重复次数大于保存的数据时才保存数据这实际上是一种复杂的问题,老实说,使用辅助函数可能更容易解决。我希望这有帮助!

胡子哥哥

它没有经过测试。在我面前没有IDE。原始代码的变化是。第二个循环少迭代一个元素。如果下一个元素不等于前一个元素,则循环退出。private void searchByte(byte[] byteMass) {&nbsp; &nbsp; &nbsp; &nbsp; int maxLength = 0&nbsp; &nbsp; &nbsp; &nbsp; int element;&nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i < byteMass.length; i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int count = 0;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (int j = i + 1; j < byteMass.length-1; j++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (byteMass[i] == byteMass[j]) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (count > length) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; maxLength = count;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; element = i;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; count++;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }
随时随地看视频慕课网APP

相关分类

Java
我要回答