RPC乱序

来源:互联网 发布:闪电分期淘宝上怎么扫 编辑:程序博客网 时间:2024/05/17 07:35

题目

分布式系统中的RPC请求经常出现乱序的情况。
写一个算法来将一个乱序的序列保序输出。例如,假设起始序号是1,
对于(1, 2, 5, 8, 10, 4, 3, 6, 9, 7)这个序列,输出是:
1
2
3, 4, 5
6
7, 8, 9, 10
上述例子中,3到来的时候会发现4,5已经在了。因此将已经满足顺序的整个序列(3, 4, 5)输出为一行。

题目解答

代码实现

//设置标记数组,表示标记数字是否已经被遍历,如果被遍历了,还需等待它之前的数被遍历,才能打印    public static void printNum(int[] arr) {        if(arr == null || arr.length == 0)            return ;        int len = arr.length;        boolean[] visited = new boolean[len+1];        int flag = 0;        int j = 1;        for(int anArr : arr) {            visited[anArr] = true;            while(j < (len + 1) && visited[j]) {                if (flag == 1) {                    System.out.print(",");                } else {                    flag = 1;                }                System.out.print(j);                j++;            }            if(flag == 1) {                System.out.println();                flag = 0;            }        }    }    public static void main(String[] args) {        int[] arr = {1, 2, 6, 8, 10, 4, 3, 5, 9, 7};        printNum(arr);    }

解法二

/**     [1,  2,  5,  8,  10,  4,  3,  6,  9,  7]     1,读到1,2,输出1,2。这时期望读到3。     2,读到的第一个不是3的数,记住下标start = 2。     3,终于读到3,记住下标end = 6。     4,对[start,end]范围内做一下快排,[3,4,5,8,10],输出3,4,5。这时将start改成8的下标 ,start = 5。     5,从end开始继续读,期望读到6。记住end = 7。对这个范围做快排,[6,8,10],输出6。改变start 为8的下标。     */    public static void printNum2(int[] arr) {        if(arr == null || arr.length == 0)            return ;        int len = arr.length;        int cur = 1;        int start = 0;        for(int i = 0; i < len; i++) {            if(cur == arr[i]) {                if(start == i) {                    System.out.println(cur);                    cur++;                    start++;                }else {                    Arrays.sort(arr, start, i+1);                    int flag = 0;                    int k ;                    for(k = start; k <= i; k++) {                        if(cur != arr[k])                            break;                        if(flag == 1) {                            System.out.print(",");                        }else {                            flag = 1;                        }                        System.out.print(cur);                        cur++;                    }                    start = k;                    System.out.println();                }            }        }    }
0 0