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



  • 相关阅读:
    Atitit 集团与个人的完整入口列表 attilax的完整入口 1. 集团与个人的完整入口列表 1 2. 流量入口概念 2 3. 流量入口的历史与发展 2 1.集团与个人的完整入口列表
    atitit 每季度日程表 每季度流程 v3 qaf.docx Ver history V2 add diary cyar data 3 cate V3 fix detail 3cate ,
    Atitit react 详细使用总结 绑定列表显示 attilax总结 1. 前言 1 1.1. 资料数量在百度内的数量对比 1 1.2. 版本16 v15.6.1 1 1.3. 引入js 2
    Atitit r2017 r3 doc list on home ntpc.docx
    Atitit r2017 ra doc list on home ntpc.docx
    Atiitt attilax掌握的前后技术放在简历里面.docx
    Atitit q2016 qa doc list on home ntpc.docx
    Atitit r7 doc list on home ntpc.docx 驱动器 D 中的卷是 p2soft 卷的序列号是 9AD0D3C8 D:\ati\r2017 v3 r01\
    Atitit 可移植性之道attilax著
    Atitit q2016 q5 doc list on home ntpc.docx
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3363685.html
Copyright © 2011-2022 走看看