写一个算法来将一个乱序的序列保输出
2015-04-06 18:43
274 查看
分布式系统中的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)输出为一行。 要求:1. 写一个高效的算法完成上述功能,实现要尽可能的健壮、易于维护2. 为该算法设计并实现单元测试基本思想是将每一行存入一个链表结点,data表示起始数据,len表示每行元素个数。貌似效率不是很高,有时间的时候改进下
写一个算法来将一个乱序的序列保序输出。例如,假设起始序号是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)输出为一行。 要求:1. 写一个高效的算法完成上述功能,实现要尽可能的健壮、易于维护2. 为该算法设计并实现单元测试基本思想是将每一行存入一个链表结点,data表示起始数据,len表示每行元素个数。貌似效率不是很高,有时间的时候改进下
1.void solve(vector<int> &data) { int start = 1; int len = data.size(); int i = 0; int k; vector<int>::iterator it; vector<int>::iterator be = data.begin(); while (i < len) { if (data[i] == start) { k = data[i]; cout << setw(5) << k; it = be + i; while (1){ k++; if (find(be, it, k) == it){ break; } else{ cout << setw(5) << k; } } cout << endl; start = k; } i++; } } 2. void solution(vector<int> &data) { int start = 1; int len = data.size(); int i = 0; bool flag = 0; map<int, int> mp; while (i < len) { mp[data[i]] = 1; while (mp[start] == 1) { flag = 1; cout << setw(5) << start; start++; } if (flag) { cout << endl; flag = 0; } i++; } }3.
struct ListNode { int data; int len; ListNode* next; }; void InsertNode(ListNode *&pHead, ListNode *pNode) { ListNode * pTmp = NULL; if(pNode == NULL) { cout << "pNode is NULL!" << endl; return; } if(pHead == NULL) { pHead = pNode; } else { for(pTmp = pHead;pTmp->next != NULL; pTmp = pTmp->next) ; pTmp->next = pNode; } } void SortAndPrint(int a[], int n) { ListNode *pHead = NULL; ListNode *temp = NULL; int i = 0; int data = 0; int dataLen = 0; while(i < n) { int j = 0; int len = 0; int moreNum = a[i]; int lessNum = a[i]; //查找小于一个数的连续数出现次数 while(j < i) { if(a[j] == lessNum-1) { j = 0; lessNum--; continue; } j++; } //只有小于一个数的所有数均出现时才存数据 if(lessNum == 1) { j = 0; while(j < i) { if(a[j] == moreNum+1) { len++; moreNum++; j = 0; continue; } j++; } ListNode *p = (ListNode*)malloc(sizeof(ListNode)); memset(p, 0, sizeof(ListNode)); p->data = a[i]; p->len = len; p->next = NULL; InsertNode(pHead, p); } i++; } //按顺序打印序列 for(temp=pHead; temp!=NULL; temp=temp->next) { dataLen = temp->len; data = temp->data; while(dataLen) { printf("%d,",data++); dataLen--; } printf("%d\n",data); } //释放资源 ListNode *prev = NULL; ListNode *curr = pHead; while(curr!=NULL) { prev=curr; curr=curr->next; if(prev != NULL) { free(prev); prev = NULL; } } }
相关文章推荐
- 阿里巴巴 2015 实习笔试题 分布式系统中的RPC请求经常出现乱序的情况 写一个算法来将一个乱序的序列保序输出
- 阿里巴巴 2015 实习笔试题 分布式系统中的RPC请求经常出现乱序的情况 写一个算法来将一个乱序的序列保序输出
- 分布式系统中的RPC请求经常出现乱序的情况 写一个算法来将一个乱序的序列保序输出
- 分布式系统中的RPC请求经常出现乱序的情况 写一个算法来将一个乱序的序列保序输出
- 分布式系统中的RPC请求经常出现乱序的情况 写一个算法来将一个乱序的序列保序输出
- 【算法学习-01】 输入一个正数 n,输出所有和为 n 连续正数序列。
- 算法习题51:输入一个正数n,输出所有和为n连续正数序列
- 输入一个正数 n,输出所有和为 n 的连续正数序列 [No. 25]
- 【小算法】从有序序列中取出间隔尽量均匀的N个数组成新有序序列输出
- 【每天算法1】:用java 语言实现,输入一个数,就相应地输出的几维数组
- 判断一个序列是否为另一个序列的子序列(两种算法)
- 输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列
- 每天一道算法题7 查找链表中倒数第k个结点 ; 输入一个单向链表。如果该链表的结点数为奇数,输出中间的结点;如果链表结点数为偶数,输出中间两个结点前面的一个
- 大学时候想的一个算法——计算数组中最大和序列
- 输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列。
- 输入一个字符串,输出该字符串的最长重复子序列。
- java一个算法题:输出一个字符串中出现次数最多的字符,以及次数
- 设计一个算法,将计算机产生的n个随机数,分为奇数、偶数两组,并将它们分别压入两个栈中,然后输出在屏幕上
- 每天学习一算法系列(13) (输入一个单向链表,输出该链表中倒数第k个结点)
- 设计一个程序,从键盘上输入若干字符串,利用算法库中的查找函数对给定的字符串进行查找,将查找后的结果输出