zoukankan      html  css  js  c++  java
  • 整型数组处理算法(十二)请实现一个函数:最长顺子。[风林火山]

    请实现一个函数:最长顺子;输入很多个整数(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



  • 相关阅读:
    ECharts之柱状图 饼状图 折线图
    Vue自定义指令(directive)
    HDU 1231 最大连续子序列
    POJ 2533 Longest Ordered Subsequence
    HDU 1163 Eddy's digital Roots
    HDU 2317 Nasty Hacks
    HDU 2571 命运
    HDU 4224 Enumeration?
    HDU 1257 最少拦截系统
    HDU 2740 Root of the Problem
  • 原文地址:https://www.cnblogs.com/riskyer/p/3362161.html
Copyright © 2011-2022 走看看