如何查找最长排序子序列的长度

时间:2014-02-05 02:09:20

标签: java

给定一个长度为整数的序列并打印最长排序子序列的长度。如果存在多个相等最大长度的子序列,则首先出现的子序列(索引最小的子序列)将用于输出

对于序列:8 2 3 4 5 6 0 10 26 24.最大长度为5.这是我到目前为止的代码。感谢你们。 注意:我不认为使用数组。我必须使用Ctrl + Z来显示最大排序子序列长度。

import java.io.IOException;

public class RepeatingCharacterPositions {
    public static void main(String[] s) throws IOException {
        int counter = 0;
        int inputValue;
        int previousNum = 0;
        int nextNum;
        while ((inputValue = System.in.read()) != -1) {
            nextNum = (int) inputValue;
            if (previousNum < nextNum) {
                counter++;
            } else if (previousNum > nextNum) {
                continue;
            }
            previousNum = nextNum;
        }
        System.out.println("Number of repeating " + counter);
    }
}

3 个答案:

答案 0 :(得分:0)

一些注意事项:

  1. 您的continue子句阻止您设置previousNum = nextNum。
  2. 当您找到减少的数字时,您可能需要重置计数器。这意味着您可能还需要一个跟踪您找到的最长序列的第二个变量。
  3. 您没有处理两个连续的相等值,至少没有明确说明。你应该考虑在你的测试中使用&gt; =或&lt; =。

        if (previousNum < nextNum)
        {
            counter++;
        }
        else if (previousNum > nextNum)
        {
            if(counter > longestSeq)
            {
                longestSeq = counter;
            }
            counter = 1;
        }
    
        previousNum = nextNum;
    

答案 1 :(得分:0)

我相信你错过了一些东西。

  • 您需要记住counter达到的最高价值
  • 要从int获取System.in,您应该使用提供方法Scanner
  • Scanner#nextInt
  • 如果两个后续数字相同,我认为他们有序。您的测试应为if (previousNum <= nextNum)
  • 如果给定的数字低于前一个,您应该将counter“重置”为 1 的值(因为任何数字本身都是有序序列 长度1

例如:

public static void main(final String[] s) {
    int counter = 0;
    int highestCount = 0;
    int previousNum = 0;
    int position = 0;
    int latestStartingPosition = 0;
    int startingPosition = 0;

    int inputValue;
    try (final Scanner sc = new Scanner(System.in)) {
        while ((inputValue = sc.nextInt()) != -1) {
            if (previousNum <= inputValue) {
                counter++;
                if (counter > highestCount) {
                    highestCount = counter;
                    startingPosition = latestStartingPosition;
                }
            } else {
                latestStartingPosition = position;
                counter = 1;
            }

            previousNum = inputValue;
            position++;
        }
    }

    System.out.println("starting pos: " + startingPosition);
    System.out.println("Number of repeating positions: " + highestCount);
}

我希望它有所帮助!


编辑:回答评论中提出的其他问题。
要获得最长有序序列开头的索引,您必须:

  • int随时了解您当前的位置
  • 引用了您遇到的最后起始位置 - 每次重置counter时,此值都会更改。
  • 当您检测到序列比之前的任何序列都长时,那么THAT序列的起始位置应该是最终的起始位置:只是每当您保存counter达到的最高价值时,请保存该信息。

请参阅上面代码中的更新示例:)

答案 2 :(得分:0)

除了ccjmne所指出的,你总是可以使用一个单独的方法来做到这一点:

public class RepeatingCharacterPositions {
    public static int findLongestSorted(int[] array) {
        int maxCount = 0, count = 0;
        int prev = array[0];
        for(int num : array) {
            if(prev <= num) {
                count++;
            } else {
                count = 1;
            }
            if(count > maxCount)
                maxCount = count;
            prev = num;
        }
        return maxCount;
    }

    public static void main(String[] s) throws IOException {
        int[] arr = {8, 2, 3, 4, 5, 6, 0, 10, 26, 24};
        System.out.println("Number of repeating positions " + findLongestSorted(arr));
    }
}

请注意,prev被初始化为数组中的第一个元素,因为只有一个元素的数组被视为已排序。执行程序后,将打印出

Number of repeating positions 5

如果在阵列上只测试一个元素,例如

int[] arr = {8};

将输出:

Number of repeating positions 1