读书人

整型数组处置算法(十二)请实现一个函

发布时间: 2013-10-11 14:52:39 作者: rapoo

整型数组处理算法(十二)请实现一个函数:最长顺子。[风林火山]
请实现一个函数:最长顺子;输入很多个整数(1<=数值<=13),
返回其中可能组成的最长的一个顺子(顺子中数的个数代表顺的长度); 其中数字1也可以代表14;
顺子包括单顺\双顺\3顺;
单顺的定义是连续5个及以上连续的数,比如1,2,3,4,5、3,4,5,6,7,8和10,11,12,13,1等;
双顺的定义是连续3个及以上连续的对(对:两个相同的数被称为对),
比如1,1,2,2,3,3、4,4,5,5,6,6,7,7和11,11,12,12,13,13,1,1等;
3顺的定义是连续2个及以上连续的3张(3张:3个相同的数被称为3张),
比如1,1,1,2,2,2、3,3,3,4,4,4,5,5,5,6,6,6和13,13,13,1,1,1等等;

比如:输入数组[1,5,2,3,4,4,5,9,6,7,2,3,3,4], 输出数组[2,2,3,3,4,4,5,5]


实现代码如下:

int putList(int k, map<int, map<int, int>* >& listData, map<int, int>* mapData) {  int nFlag =0;if (0 == k && mapData->size() >= 5) {  nFlag =1;//listData.put(mapData.size(), mapData);  listData.insert(pair <int, map<int, int>* >( mapData->size(), mapData));}  if (1 == k && mapData->size() >= 3) {  nFlag =1;//listData.put(2 * mapData.size(), mapData);  listData.insert(pair <int,  map<int, int>* >(2* mapData->size(), mapData));}  if (2 == k && mapData->size() >= 2) {  nFlag =1 ;//listData.put(3 * mapData.size(), mapData); listData.insert(pair <int, map<int, int>* >( 3*mapData->size(), mapData));}  return nFlag;}map<int, int>* getList(int* count, int k, int num, int& nMaxCount) {  map<int, map<int, int>* > listData;//= new map<int, map<int, int>*>();  map<int, int>* mapTemp = NULL;  int flag = 0;  int nRet = 0;for (int i = 1; i < num; i++) {  if (count[i] > k && flag == 0) {  flag = 1;  mapTemp = new map<int, int>;//mapTemp.put(i, count[i]);  mapTemp->insert(pair <int, int>( i, count[i]));} else if (count[i] > k && flag == 1) {  //mapTemp.put(i, count[i]);  mapTemp->insert(pair <int, int>( i, count[i]));if (13 == i) {  if (count[14 - i] > k) {  //mapTemp.put(14 - i, count[14 - i]); mapTemp->insert(pair <int, int>( 14 - i, count[14 - i]));nRet = putList(k, listData, mapTemp); //不是顺子,释放内存if (nRet==0){delete mapTemp;mapTemp = NULL;}} else {  flag = 0;  nRet=putList(k, listData, mapTemp);  //不是顺子,释放内存if (nRet==0){delete mapTemp;mapTemp = NULL;}}  }  } else if (count[i] <= k && flag == 1) {  flag = 0;  nRet=putList(k, listData, mapTemp);  //不是顺子,释放内存if (nRet==0){delete mapTemp;mapTemp = NULL;}}  } if (listData.size() > 0)  {listData.rend();map<int, map<int, int>* >::iterator it = listData.begin();nMaxCount = (*it).first;map<int, int>* mapReturn = (*it).second;map<int, int>* maptemp;it++;for (; it!=listData.end(); it++){maptemp = (*it).second;delete maptemp;maptemp = NULL;}return mapReturn;//return listData[listData.size()-1];//return list.get(list.lastKey()); }else  return NULL;  }  int* GetLongeststr(int* array, int nCount, int& outCount, int MaxNum) {int* count = new int[MaxNum+1];   memset(count, 0, MaxNum*sizeof(int));int nMaxLoop=0;int nMaxTemp;int nMax1Loop=0;int nMax2Loop=0;int nMax3Loop=0;int nMaxkey =0;for (int i = 0; i < nCount; i++) {  if (array[i] < 1 || array[i] > MaxNum)   return NULL;  ++count[array[i]];}map<int, map<int, int>*> allList;// = new TreeMap<Integer, Map<Integer, Integer>>();map<int, int>* mapTemp = NULL;  map<int, int>* map1Temp = NULL;map<int, int>* map2Temp = NULL;map<int, int>* map3Temp = NULL;for (int k = 0; k < 3; k++) {  mapTemp = getList(count, k, MaxNum, nMaxTemp);if (NULL != mapTemp) {  if (0 == k) {//allList.put(map.size(), map); //allList.insert(pair <int, map<int, int>*>( mapTemp->size(), mapTemp));map1Temp = mapTemp;nMax1Loop = nMaxTemp;nMaxLoop=nMaxTemp;}else if (1 == k)  {//allList.put(2 * map.size(), map);  //allList.insert(pair <int, map<int, int>*>( 2*mapTemp->size(), mapTemp));if (nMaxTemp>=nMaxLoop){map2Temp = mapTemp;nMax2Loop = nMaxTemp;nMaxLoop = nMaxTemp;}else{delete mapTemp;mapTemp =NULL;}}else  {//allList.put(3 * map.size(), map); //allList.insert(pair <int, map<int, int>*>( 3*mapTemp->size(), mapTemp));if (nMaxTemp>=nMaxLoop){map3Temp = mapTemp;nMax3Loop = nMaxTemp;nMaxLoop = nMaxTemp;}else{delete mapTemp;mapTemp =NULL;}}}  }delete[] count;count = NULL;if (nMaxLoop>0){if (nMaxLoop == nMax3Loop){nMaxkey = 3;mapTemp = map3Temp;}else if (nMaxLoop == nMax2Loop){nMaxkey = 2;mapTemp = map2Temp;}else{nMaxkey = 1;mapTemp = map1Temp;}outCount = nMaxLoop;int* result = new int[outCount]; int k; int nAllCount = 0;map<int, int>::iterator itorResult;for (itorResult = mapTemp->begin(); itorResult!=mapTemp->end(); itorResult++){k = itorResult->first;for (int j =0; j<nMaxkey; j++){result[nAllCount++] = k;cout << itorResult->first <<",";}}cout << endl;if (map1Temp!=NULL){delete map1Temp;map1Temp = NULL;}if (map2Temp!=NULL){delete map2Temp;map2Temp = NULL;}if (map3Temp!=NULL){delete map3Temp;map3Temp = NULL;}return result;}else {outCount = 0;return NULL;}} 

有兴趣的朋友可以自己试试,仅提供参考。


转载请注明原创链接:http://blog.csdn.net/wujunokay/article/details/12586489



读书人网 >编程

热点推荐